[英]Show output while execute long-time running command Java without waiting RuntimeExec
我有大約需要 4 分鍾才能完成執行的命令。 從 windows 命令提示符執行命令時,它顯示計時信息和連續輸出。
我想在從我的 Java 代碼運行命令時顯示該輸出。 正常執行一直等到命令退出並得到輸出。 我想在不等待命令完成的情況下在運行時獲取輸出。
這是我的代碼:
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
來生成視頻的某些分辨率。 它將輸出消息寫入ErrorStream
而不是OutputStream
。 當我首先打印錯誤流時,我可以看到輸出。
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類。 它的inheritIO()方法將完全符合您的要求:
ProcessBuilder builder = new ProcessBuilder(args);
builder.inheritIO();
Process process = builder.start();
您無法一次讀取進程的所有標准輸出或標准錯誤。 它們可以同時出現,無法讀取其中任何一個可能會或可能不會導致進程掛起。 inheritIO()
解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.