BufferedReader 似乎无限读取第一行
BufferedReader seems to infinitely read the first line
我正尝试通过我正在编写的 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);
}
它适用于我的测试文件,但是当 errorreader 运行 超出要读取的行并且 readLine() 无限锁定线程时它会挂起。在全长文件上,文件会被转换,但是这部分代码会被锁定,因此它永远不会继续应用程序。
有什么建议吗?
在创建进程之前调用builder.redirectErrorStream(true);
(这会将输入流和错误流合并为一个:输入流),并且只从InputStream中读取。
那应该可以解决错误流 运行 在输入流之前没有数据的问题。
如果您确实希望将它们分开,那么您可以启动两个线程,一个从输入流读取,一个从错误流读取。
我正尝试通过我正在编写的 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);
}
它适用于我的测试文件,但是当 errorreader 运行 超出要读取的行并且 readLine() 无限锁定线程时它会挂起。在全长文件上,文件会被转换,但是这部分代码会被锁定,因此它永远不会继续应用程序。
有什么建议吗?
在创建进程之前调用builder.redirectErrorStream(true);
(这会将输入流和错误流合并为一个:输入流),并且只从InputStream中读取。
那应该可以解决错误流 运行 在输入流之前没有数据的问题。
如果您确实希望将它们分开,那么您可以启动两个线程,一个从输入流读取,一个从错误流读取。