BufferedReader.reader.Readline()在Java中返回什么都没有返回

发布于 2025-01-29 23:23:50 字数 931 浏览 5 评论 0原文

我有以下代码:

  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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南巷近海 2025-02-05 23:23:50

您必须在不同的线程上消耗stdout和stderr,因为如果其中一个输出流填充其缓冲区,而您仅在另一个流中阅读,则该过程无限期地封锁。

或者,切换到使用processBuilder并将stderr映射到stdout,然后您只需从合并的流而不是两个流中读取:

ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
Process pr = pb.start();
... Your reading code for reader, eReader is not required
int rc = exec.waitFor();

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:

ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
Process pr = pb.start();
... Your reading code for reader, eReader is not required
int rc = exec.waitFor();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文