BufferedReader.reader.Readline()在Java中返回什么都没有返回
我有以下代码:
Process pr = run.exec(sonarScannerCommand);
BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
BufferedReader eReader = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
StringBuilder output = new StringBuilder();
String line;
boolean error = false;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
if (line.contains("EXECUTION FAILURE")) {
error = true;
}
log.info(line);
}
String errorString = "";
while ((line = eReader.readLine()) != null) {
if (errorString.equals("") && error) {
errorString = line;
}
output.append(line + "\n");
log.error(line);
}
pr.waitFor(5, TimeUnit.MINUTES);
在此过程中的某个时刻,它冻结并且不会前进。 它没有返回到readline()方法,并且被卡住了,等待无法返回的东西。 我该如何管理此等待? 谢谢
I have the following code:
Process pr = run.exec(sonarScannerCommand);
BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
BufferedReader eReader = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
StringBuilder output = new StringBuilder();
String line;
boolean error = false;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
if (line.contains("EXECUTION FAILURE")) {
error = true;
}
log.info(line);
}
String errorString = "";
while ((line = eReader.readLine()) != null) {
if (errorString.equals("") && error) {
errorString = line;
}
output.append(line + "\n");
log.error(line);
}
pr.waitFor(5, TimeUnit.MINUTES);
At some point in the process, it freezes and doesn't move forward.
It returns nothing to the readLine () method and gets stuck waiting for something that doesn't return.
How can I manage this wait?
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须在不同的线程上消耗stdout和stderr,因为如果其中一个输出流填充其缓冲区,而您仅在另一个流中阅读,则该过程无限期地封锁。
或者,切换到使用
processBuilder
并将stderr映射到stdout,然后您只需从合并的流而不是两个流中读取:You must consume stdout and stderr on different threads, because if one of these output streams fills its buffer while you are only reading from the other stream, then the process blocks indefinitely.
Alternatively switch to using
ProcessBuilder
and map stderr to stdout, then you just read from the merged stream not both streams: