Make BufferedReader不等待Process完成

时间:2012-02-27 13:59:45

标签: java process bufferedreader

我有一个在unix(shell-script)下运行的进程。此脚本连续运行并每秒生成更多输出。

现在我尝试使用Java中的BufferedReader获取它的当前输出。现在我意识到这个正在等待这个过程完成,所以它一直在等待。

我怎么能意识到这一点呢?我只想将Process p的当前输出作为String。

到目前为止我得到了什么:

    Process p = Runtime.getRuntime().exec("./myScript.sh");
    InputStream stdin = p.getInputStream();
    InputStreamReader isr = new InputStreamReader(stdin);
    BufferedReader br = new BufferedReader(isr);
    String returner = "";
    String line = null;
    try {
        while ( (line = br.readLine()) != null) {
            returner += line;

        }
    }
    catch (IOException e) {
        System.err.println( "Processhandling went terribly wrong!");
        System.exit(1);
    }

感谢您的帮助

问候,Flo

3 个答案:

答案 0 :(得分:0)

您将读取的每一行追加到现有字符串中。

首先,追加这样的字符串效率很低 - 你应该使用StringBuilder,特别是对于大字符串或众多字符串。你的方法会越来越慢(并最终填满所有内存)。

你会永远追加(只要有输入数据),正如你所说,它永远不会完成。

您需要读取一大块数据(可能一次一行,但这取决于您的数据),然后处理该块(可能在另一个线程中,以便读取和处理可以并行发生)。

所以而不是:

    while ( (line = br.readLine()) != null) {
        returner += line;

    }

你需要:

    while ( (line = br.readLine()) != null) {
        processLine(line);
    }

processLine()对数据做了有用的事情。

答案 1 :(得分:0)

由于您获得连续输出,以下代码将永远运行。

while ( (line = br.readLine()) != null) {
    returner += line;

}

我不确定你想要的是什么...如果你的脚本无限期地运行,那么你的字符串将继续增长,这个过程永远不会返回。

答案 2 :(得分:0)

现在它将永远运行,因为没有理由停止。 如果您在代码中添加以下内容,则可能会获得您想去的位置。

例如,你可以像这样停止一个条件:

boolean hasReachedGoal = false;
while ( !hasReachedGoal && (line = br.readLine()) != null) {
    hasReachedGoal = line.contains("the string i was looking for")
    returner += line;
}