我正在使用Java创建GUI。此GUI使用ProcessBuilder类从命令行启动程序。
有关正在启动的进程的一些信息:从命令行,它创建另一个窗口并将信息打印到所述窗口。
在我的GUI窗口中,我有一个文本区域,我想重定向所述输出。我原本打算使用SwingWorker对象来不断检查更多输出而不是阻止GUI。为了测试并确保我原来的语法已经关闭(甚至没有将GUI带入事物中)我想我会将辅助进程窗口的输出打印到System.out。但是,有些东西似乎是错误的,因为我可以在辅助进程的窗口中看到输出,但不是我正在工作的终端。
代码摘录如下:
Process p = pb.start();
Scanner s = new Scanner(p.getInputStream());
SwingWorker pipe = new SwingWorker<String, Void> (){
public String doInBackground(){
while(run){
if(s.hasNextLine()){
System.out.println("S has next!");
System.out.println(s.nextLine());
}
}
return null;
}
};
pipe.execute();
布尔运行在程序的其他地方定义,并在进程p退出或强制退出时设置为false(另外一个问题:这是一个非常糟糕的主意吗?我觉得它可能是......)。
当我看到它被打印到另一个窗口时,有没有人知道为什么我从来没有得到任何输出?最初我的反应是使用p.getOutputStream(),但Scanner不会将outputStream作为参数。
感谢您的时间。
答案 0 :(得分:3)
您还应该扫描p.getErrorStream()
- 某些程序写入STDERR,从命令行运行时与STDOUT无法区分。通常很好的做法是使用两个流,就好像任何一个都没有被消耗它可能会导致外部进程挂起。
答案 1 :(得分:2)
如果外部进程正在将其输出写入其自己的窗口,则几乎可以肯定输出未写入STDOUT,这是您使用代码读取的内容。如果它这样做,则外部程序的输出将出现在其窗口和启动它的命令行会话中(如果存在)。如果不访问外部程序的源代码,除非作者为该功能做出规定(即将输出重定向到STDOUT而不是窗口的命令行开关),否则您不可能截取其输出。
对于p.getOutputStream()
,它返回一个从你的角度“输出”的流 - 即你写入它以向进程'STDIN发送数据。对于外部程序写入STDOUT的情况,您对p.getInputStream()
的使用是正确的。