簡體   English   中英

在執行長時間運行的 Java 命令時顯示輸出,無需等待 RuntimeExec

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM