1

我有大约需要 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());
        }

这段代码的问题在于它会在命令结束之前立即打印所有输出。

4

2 回答 2

0

最简单的解决方案是停止使用 Runtime.exec,而改用更现代的ProcessBuilder类。它的inheritIO()方法将完全满足您的要求:

ProcessBuilder builder = new ProcessBuilder(args);
builder.inheritIO();
Process process = builder.start();

您不能一次读取所有进程的标准输出或标准错误。它们可以同时出现,并且未能读取任何一个可能会或可能不会导致进程挂起。 inheritIO()解决了这个问题。

于 2020-03-27T15:31:56.990 回答
0

出于一个我不知道的原因,我使用的命令,即 ffmpeg -i生成视频的某些分辨率。它将输出消息写入ErrorStreamnot 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());
    }
于 2020-03-27T14:14:15.077 回答