2012-04-03 55 views
2

我有一些使用Java apache exec类运行外部进程的简单代码。缺少Windows中Java进程的命令行输出

Executor ex = new DefaultExecutor(); 
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.out, System.in)); 
    CommandLine cl = new CommandLine(
    "C:\\program.exe"); 

    ex.execute(cl); 

}

对于某些命令行程序,这是否运行正常并得到所有的程序的输出到“出”流而接受我自己的文成“在”流。但是,对于其他程序,该进程的输出是可见的,从命令行手动运行,但是当我通过java进程运行时,没有任何东西进来。

我想最终写入标准输入并检索和分析代码本身内的标准输出。

如果有我不知道的原因,为什么某些程序似乎在命令行上输出文本,但是当我将它们作为java进程运行时,我没有通过流接收任何东西?

这发生在Windows中。

+0

也许你有这个问题的问题:http://stackoverflow.com/questions/27249101/windows-prevents-stdout-from-external-command-line-executions-to-be-redirected-t – radio 2014-12-02 12:09:23

回答

0

进程外代码不会进入相同的命令行输出,除非您明确地配置它。另外,作为一般规则,最好使用log4j之类的日志库而不是println语句。

+0

我会最终能够写入流程stdin并从我的java代码本身的stdout中读取,在提示符处模仿人类。这种限制有可能吗? – user1309154 2012-04-03 13:40:12

+0

你可以,但它很烦人。在Process类中使用getOutputStream/getInputStream进行配置。但我已经读过,如果你在外部过程本身内部这样做,它可能会产生死锁。有解决方法(显然你可以在另一个进程中进行配置)。或者,你可以使用ProcessBuilder重定向I/O流:http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream – smcg 2012-04-03 13:58:33

+0

我可能会误解。但在我的代码中,我将System.out和Streams传递到PumpStreamHandler构造函数中,这是一个Apache exec类,我相信这是在内部进行流处理的。我的问题是,对于一些外部程序,包括我自己编写的虚拟程序,我可以成功检索所有输出,但是一些其他外部程序即使在Windows cmd行也会输出空白输出,但它们会正确输出。 – user1309154 2012-04-03 14:07:17