Показать вывод во время выполнения длительной команды Java без ожидания RuntimeExec - PullRequest
0 голосов
/ 27 марта 2020

У меня есть команда, выполнение которой занимает около 4 минут. При выполнении команды из командной строки windows она отображает информацию о времени и непрерывный вывод.

Я хочу показать этот вывод при выполнении команды из моего кода Java. Нормальное выполнение ожидает, пока команда не выйдет и не получит вывод. Я хочу получить вывод во время работы, не дожидаясь, пока команда завершится затем распечатайте все выходные сразу.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Самое простое решение - прекратить использование Runtime.exe c и использовать вместо него более современный класс ProcessBuilder . Его метод inheritIO () будет делать именно то, что вы хотите:

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

Вы не можете прочитать все стандартные выходные данные процесса или стандартную ошибку сразу. Они могут появляться одновременно, и если не удается прочитать одно из них, это может привести к зависанию процесса. inheritIO() решает эту проблему.

0 голосов
/ 27 марта 2020

По причине, о которой я не знаю, я использую команду, которая 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());
    }
...