2010-08-17 149 views
3

我想用apache commons exec运行交互命令。除了当我的命令被执行并等待用户输入时,除了当我按下回车使其无法使用时,我在控制台中看不到我的输入时,一切都可以正常工作。用apache commons运行交互命令exec

这是一个互动节目的一个例子:

public static void main(String[] args) { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     String line = null; 
     while (true) { 
      System.out.print("=> "); 
      try { 
       line = in.readLine(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println(line); 
     } 
    } 

现在我想执行一个与Apache公地高管是这样的:

public static void main(String[] args) { 
    Executor ex = new DefaultExecutor(); 
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in)); 
    CommandLine cl = new CommandLine("java"); 
    cl.addArguments("-cp target\\classes foo.bar.Main"); 

    try { 
     ex.execute(cl); 
    } catch (ExecuteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

正如我所说的,它基本上是工作,我得到“=>”提示符,但是当我键入一些东西时,我才看到它,直到我按下回车键。我在Windows 7上使用cmd提示符执行此操作。 我很感激任何关于如何达到预期行为的提示。

编辑:它按预期在linux上工作。我想这是Windows cmd提示符的问题。如果可能的话,我仍然希望能够做到这一点,所以我希望能够深入了解Windows上的这种行为。

Edit2:我也用msys shell和powershell测试过,都表现出同样的问题。

Edit3:我通过启动一个单独的cmd提示来解决这个问题。这工作,但我仍然想知道为什么。

CommandLine cl = new CommandLine("cmd"); 
cl.addArguments("/C java -cp target\\classes foo.bar.Main"); 

感谢

拉乌尔

回答

2

我不知道到底是什么您期望在这里发生;如果产生的过程被设计为等待从其输入中读取,那么当它完成时它应该不会令人惊讶吗?

如果这是问题,并且您的问题是“我如何让我的程序自动发送换行符到生成的进程的输入?”,那么您需要定义一个OutputStream来写入输入,并且请抓住ExecuteStreamHandler将其附加到流程中。类似以下内容:

Executor ex = new DefaultExecutor(); 

// Create an output stream and set it as the process' input 
OutputStream out = new ByteArrayOutputStream(); 
ex.getStreamHandler().setProcessInputStream(out); 
... 
try 
{ 
    ex.execute(cl); 
    out.write("\n".getBytes()); // TODO use appropriate charset explicitly 
... 
+0

谢谢,但不幸的是,这不是我想要的。我想在输入内容的时候在我的cmd提示符下得到反馈,而我不知道。当我运行我的例子时,我得到了“=>”提示符,但是当我键入一些东西时,它不可见。它显示出来,当我按下输入虽然。此外,执行阻塞,直到产生的进程退出,所以我不知道你的例子会做什么不同的事情?! – 2010-08-17 17:28:01

+0

这并不回答他的问题。 – 2016-06-17 00:58:51

0

使用Apache exec org.apache.commons.exec.DefaultExecuteResultHandler可以启动非阻塞命令。然后你可以按照@Andrzej提到的步骤行事。