BufferedReader似乎无限读取第一行

时间:2015-06-12 01:46:37

标签: java process bufferedreader handbrake

我试图通过我正在编写的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()无限地锁定线程时,它会挂起。在全长文件上,文件被转换,但这部分代码被锁定,因此它永远不会继续使用该应用程序。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

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

这应解决输入流之前错误流用完数据的问题。

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