使用Process Builder重定向流程的输出

时间:2013-09-26 14:10:37

标签: java

我正在尝试在自己的控制台窗口中运行plink。我开始使用Process.exec(),并且工作正常。我开始使用ProcessBuilder,现在直到我终止进程才输出输出。

我的代码如下所示:

    class ConsoleOutputThread extends Thread {

    public void start(String processName) {
        // this was old code: Runtime r = Runtime.getRuntime();
        try {
            builder = new ProcessBuilder("plink", "-ssh", "192.168.3.21");
            builder.redirectErrorStream(true);
            process = builder.start();
            //this was old code: process = r.exec (processName);
        } catch (IOException ex) {
        }
        start();
    }

    @Override
    public void run() {
        try {
            BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            try {
                process.waitFor();
            } catch (InterruptedException ex) {
            }
            char    b[];
            b = new char[1];
            while(is.read(b, 0, 1)> 0) {
                // this is for debug, normally sent to console
                System.out.println("Got character: " + b[0]);
            }
        } catch (IOException ex) {
        }
    }
}

因此,使用Runtime.exec()时一切正常。现在,使用ProcessBuilder,读取功能永远阻塞(实际上,直到我杀死进程,然后进行任务)。但是,错误流有效,即如果我选择了错误的选项,我会在控制台中收到消息。 我可能在这里缺少一些东西并寻求帮助。 谢谢

1 个答案:

答案 0 :(得分:0)

您已将plink进程设置为将其输出写入连接到java进程的管道。 plink进程输出的任何内容都将保存在操作系统缓冲区中,直到您的进程读取它为止。 OS缓冲区的容量有限,如果plink写入太多数据,那么它将阻塞,直到您的进程从缓冲区中读取一些数据。

不幸的是,java进程在从管道读取任何内容之前等待plink进程完成。因此,如果plink进程写入太多输出,它将无限期地阻塞。

在调用plink之前,您应该更改java逻辑以读取waitfor()进程的输出。