在不等待RuntimeExec的情况下执行长时间运行的Java命令时显示输出
我有一个命令,大约需要4分钟才能完成执行。在windows命令提示符下执行命令时,它显示计时信息和连续输出 我希望在从Java代码运行命令时显示该输出。 正常执行将等待命令退出并获得输出。我希望在运行时获得输出,而不必等待命令完成 这是我的密码:在不等待RuntimeExec的情况下执行长时间运行的Java命令时显示输出,java,command-line-tool,java-runtime-compiler,java-process-runtime,Java,Command Line Tool,Java Runtime Compiler,Java Process Runtime,我有一个命令,大约需要4分钟才能完成执行。在windows命令提示符下执行命令时,它显示计时信息和连续输出 我希望在从Java代码运行命令时显示该输出。 正常执行将等待命令退出并获得输出。我希望在运行时获得输出,而不必等待命令完成 这是我的密码: try{ Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(args); String line="";
try{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(args);
String line="";
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
errorReader.lines().forEach(System.out::println);
process.waitFor();
System.out.println("---------------------------------------");
}
catch (Exception x){
System.out.println(x.getMessage());
}
这段代码的问题是,在命令结束之前,它会立即打印所有输出。出于我不知道的原因,我使用的命令是
ffmpeg-I
,以生成视频的某些分辨率。它将输出消息写入错误流
而不是输出流
。当我首先打印错误流时,我可以看到输出
try{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(args);
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
BufferedReader lineReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = err.readLine()) != null) {
System.out.println(line);
}
err.close();
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
process.waitFor();
System.out.println("---------------------------------------");
}
catch (Exception x){
System.out.println(x.getMessage());
}
出于我不知道的原因,我使用的命令是
ffmpeg-I
,用于生成视频的某些分辨率。它将输出消息写入错误流
而不是输出流
。当我首先打印错误流时,我可以看到输出
try{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(args);
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
BufferedReader lineReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = err.readLine()) != null) {
System.out.println(line);
}
err.close();
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
process.waitFor();
System.out.println("---------------------------------------");
}
catch (Exception x){
System.out.println(x.getMessage());
}
最简单的解决方案是停止使用Runtime.exec,而是使用更现代的类。其方法将完全满足您的要求:
ProcessBuilder builder = new ProcessBuilder(args);
builder.inheritIO();
Process process = builder.start();
您不能同时读取进程的所有标准输出或标准错误。它们可以同时出现,如果不读取其中任何一个,可能会导致进程挂起,也可能不会导致进程挂起<代码>继承()解决了这个问题。最简单的解决方案是停止使用Runtime.exec,而是使用更现代的类。其方法将完全满足您的要求:
ProcessBuilder builder = new ProcessBuilder(args);
builder.inheritIO();
Process process = builder.start();
您不能同时读取进程的所有标准输出或标准错误。它们可以同时出现,如果不读取其中任何一个,可能会导致进程挂起,也可能不会导致进程挂起<代码>继承()解决了这个问题