2015-12-15 141 views
0

我想在我的Java应用程序中运行控制台命令,该命令监听传入的消息并在接收到消息时将其记录到控制台。当我在终端中执行它时,console命令运行良好。所以我想运行该命令,然后在输出一行时执行某些操作,然后继续运行并监听其他新消息。我想这通过下面的代码:监听控制台命令输出

try { 
    ProcessBuilder builder = new ProcessBuilder(PYTHON_PATH, YOWSUP_CLI_PATH, "demos", "-r", "-c", YOWSUP_CONFIG); 
    builder.redirectErrorStream(true); 
    Process p = builder.start(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String line = ""; 
    log.info("Started listening..."); 

    // It does nothing from here on 
    while ((line = reader.readLine()) != null) { 
     log.info(line); 
    } 
    log.info("Stopped listening."); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

但是当我运行这段代码,它记录了“开始听...”字符串,因此我将消息发送到尝试,但它不会记录并且只是不做任何事情而继续奔跑。

如果我没有正确解释某件事,就这么说!

+1

看看[这个](http://stackoverflow.com/questions/19102989/java-is-there-a-way-to-run-a-system-command-and-print-the-output -during-executi/19103198#19103198),也可能尝试使用'ProcessBuilder#inheritIO' - 我假设你正在尝试运行python命令 – MadProgrammer

+0

@MadProgrammer谢谢!我的python命令中的'-u'参数确实有效。 –

回答

0

我固定它用在我的命令中的 “-u” 参数,利用MadProgrammer this answer

0

可以使用rt.exec命令是这样的:

try {    
      proc = rt.exec(command); 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
      int value=0; 
      String line = null; 
      while ((line = stdInput.readLine()) != null) {  
       System.out.println(line); 
      } 
      while ((line = stdError.readLine()) != null) { 
       System.out.println(line); 
      } 
      proc.waitFor(); 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
+0

'ProcessBuilder'通常是首选,因为它更具可配置性,但更大的问题是python在它的一边做了一些奇怪的事情,有时候会阻止我们读取它的输出,至少在它退出之前 – MadProgrammer