【发布时间】: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 - 哪个片段的输出?
-
我认为的第二件。
-
这是唯一的解释:子进程不断产生相同的数据。从
stdout和stderr交替读取行不可能工作,除非子进程在两者上产生相同数量的行,这是极不可能的。进程输出应该在单独的线程中使用,或者通过合并流来使用。
标签: java process bufferedreader handbrake