我有一个在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
答案 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;
}