在不等待RuntimeExec的情况下执行长时间运行的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="";

我有一个命令,大约需要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
,以生成视频的某些分辨率。它将输出消息写入
错误流
而不是
输出流
。当我首先打印错误流时,我可以看到输出

        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();
您不能同时读取进程的所有标准输出或标准错误。它们可以同时出现,如果不读取其中任何一个,可能会导致进程挂起,也可能不会导致进程挂起<代码>继承()解决了这个问题