当前位置: 首页 > 知识库问答 >
问题:

BufferedReader。读者readLine()在Java中不返回任何内容

池阳伯
2023-03-14

我有以下代码:

  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()方法返回任何内容,并且会陷入等待不返回的内容。我如何管理这种等待?谢谢

共有1个答案

侯兴为
2023-03-14

您必须在不同的线程上使用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();
 类似资料:
  • 问题内容: 我正在尝试在Java程序中阅读标准输入。我期望一系列数字后跟换行符,例如: 当通过eclipse内置控制台提供输入时,一切都会顺利进行。但是,使用Windows命令行时,程序将输出: 我的代码是: 有什么线索吗? 问题答案: 得到a 表示相关对象已到达EOF(文件末尾),或者换句话说,它们无法再获得任何标准输入。现在,您的代码明显的问题是: 的每个方法调用都会创建一个 新的 。 每个这

  • 问题内容: 我试图在多个线程中逐行读取套接字的输入。如何中断,以便可以正常停止正在阻塞的线程? 编辑(赏金) :可以在不关闭套接字的情况下完成此操作吗? 问题答案: 关闭中断线程上的套接字。这将导致在中断的线程上引发异常。 有关此和其他并发问题的更多信息,我强烈推荐Brian Goetz的书“ Java并发实践”。

  • 我有一个像这样的mysql表 但是我无法用这个函数检索“成人”和“儿童”的值 错误日志显示变量被正确地传递给函数: 为什么此函数返回?

  • 如何获取java主目录? 这样做的时候 一无所获

  • 我的问题是: 接下来我用 它返回[],即不返回任何内容 但是如果我设置cursor=conn.cursor(),同样的查询会返回一些行!怎么了?为什么我不能使用游标?

  • TestCase 2: baseChars:['a','b'] 所需字符串长度:1 产出: 有人能帮忙吗?我已经把我的代码放在GitHub里了。如果您可以将我的实现更改为非递归,但保留函数返回类型,也将受到重视。