【问题标题】:BufferedReader seems to infinitely read the first lineBufferedReader 似乎无限读取第一行
【发布时间】:2015-06-12 01:46:36
【问题描述】:

我正在尝试通过我正在编写的 Java 应用程序运行 Handbrake,但在等待 Handbrake 完成时遇到了麻烦。

当我尝试这个时:

        ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe", "/c", command);
        Process p = builder.start();

        BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while((line = inputreader.readLine()) != null)
        {
            System.out.println(line);
        }

我得到的输出是:

Encoding: task 1 of 1, 0.00 %

一遍又一遍,文件永远不会被转换。

当我将其更改为以下内容时:

        BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader errorreader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String line = null;
        String line2 = null;
        while((line = inputreader.readLine()) != null && (line2 = errorreader.readLine()) != null)
        {
            System.out.println(line);
            System.out.println(line2);
        }

它适用于我的测试文件,但是当错误读取器用完要读取的行并且 readLine() 无限锁定线程时,它会挂起。在全长文件上,文件被转换,但这部分代码被锁定,因此它永远不会继续应用程序。

有什么建议吗?

【问题讨论】:

  • 我总体感觉您正在等待的进程没有得到执行的机会,因此您挂断了来自它的相同输出。
  • @TimBiegeleisen - 这是我最初的想法,但是当第二个想法起作用时,我对导致这种情况发生的原因感到困惑。
  • @fftk4323 - 哪个片段的输出?
  • 我认为的第二件。
  • 这是唯一的解释:子进程不断产生相同的数据。从stdoutstderr 交替读取行不可能工作,除非子进程在两者上产生相同数量的行,这是极不可能的。进程输出应该在单独的线程中使用,或者通过合并流来使用。

标签: java process bufferedreader handbrake


【解决方案1】:

在创建流程之前调用builder.redirectErrorStream(true);(这会将输入和错误流合并为一个:输入流),并且只从InputStream中读取。

应该可以解决错误流在输入流之前用完数据的问题。

如果您确实想将它们分开,那么您可以启动两个线程,分别从输入流和错误流中读取。

【讨论】:

  • 嗯,这似乎解决了这两个问题。知道为什么这样做会导致第一个工作吗?
  • 不是一个明确的原因,但是:这些流是容量有限的管道。如果您没有从错误流中读取(在第一个示例中),则它最终已满,这意味着该过程无法继续。我的猜测:handbrake 可能是多线程的,并且执行转换的线程写入错误流。该线程被阻塞,因为错误流管道已满。另一个线程将数据发送到输入流(从手刹的角度来看是stdout输出流),并且由于转换线程被阻塞,它一直发送“0%”。
  • 这是一个有趣的想法,我将不得不尝试更深入地挖掘,看看是否可以验证导致问题的类似原因。感谢您的意见!
猜你喜欢
  • 2011-03-29
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2021-10-13
  • 2012-03-14
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多