将另一个程序的输出打印到java文本区域

时间:2010-01-05 18:37:26

标签: java process swingworker

我正在使用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作为参数。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

您还应该扫描p.getErrorStream() - 某些程序写入STDERR,从命令行运行时与STDOUT无法区分。通常很好的做法是使用两个流,就好像任何一个都没有被消耗它可能会导致外部进程挂起。

答案 1 :(得分:2)

如果外部进程正在将其输出写入其自己的窗口,则几乎可以肯定输出未写入STDOUT,这是您使用代码读取的内容。如果它这样做,则外部程序的输出将出现在其窗口和启动它的命令行会话中(如果存在)。如果不访问外部程序的源代码,除非作者为该功能做出规定(即将输出重定向到STDOUT而不是窗口的命令行开关),否则您不可能截取其输出。

对于p.getOutputStream(),它返回一个从你的角度“输出”的流 - 即你写入它以向进程'STDIN发送数据。对于外部程序写入STDOUT的情况,您对p.getInputStream()的使用是正确的。