Вывести возвращаемые значения исполняемого файла

1

Я разворачиваю файл.m файла matlab в консольное приложение Windows. Файл Matlab, который я развертываю, фактически является функцией matlab, которая не имеет аргументов и возвращает список целых чисел. Я запускаю этот.exe из java-кода, используя процесс для запуска исполняемого файла. Я пытаюсь прочитать возвращаемые значения, используя следующий код:

            Process process = Runtime.getRuntime().exec("epidemic.exe");
            //process.waitFor();
            System.out.println("....");

            InputStream in = process.getInputStream();  // To read process standard output
            InputStream err = process.getErrorStream(); // To read process error output

            while (process.isAlive()) {
                while (in.available() > 0 || err.available() > 0) {
                    if (in.available() > 0) {
                        System.out.print((char)in.read()); // You might wanna echo it to your console to see progress
                    }
                    if (err.available() > 0) {
                        err.read(); // You might wanna echo it to your console to see progress
                    }
                }

                Thread.sleep(1);
            }


           System.out.println("....");

EDIT: Исходя из предлагаемых изменений, я меняю свой код. Опять же, он не отображает возвращаемые значения. Если этот код в порядке, как я могу проверить, действительно ли исполняемый файл возвращает значения?

  • 0
    Я отредактировал пост.
  • 0
    Вы используете javaw или java исполняемый файл для его запуска? javaw скроет окно консоли.
Показать ещё 4 комментария
Теги:
executable

1 ответ

2
Лучший ответ

Ваш в while цикл пытается прочитать целые строки из стандартного вывода запущенного процесса.

Я подчеркнул потенциальные проблемы. Если процесс не записывает целую строку или, например, записывает ее на стандартную ошибку, reader.readLine() будет блокироваться навсегда.

Также обратите внимание, что процесс имеет 2 выходных потока: стандартный вывод и стандартную ошибку. У обоих есть буфер, и если какой-либо из них заполняется, если вы его не читаете, процесс будет заблокирован при попытке записать больше выходов.

Чтобы гарантировать, что процесс не блокируется, вы должны прочитать оба его выходных потока, вот пример того, как это сделать:

InputStream in = process.getInputStream();  // To read process standard output
InputStream err = process.getErrorStream(); // To read process error output

while (proc.isAlive()) {
    while (in.available() > 0 || err.available() > 0) {
        if (in.available() > 0)
            in.read(); // You might wanna echo it to your console to see progress

        if (err.available() > 0)
            err.read(); // You might wanna echo it to your console to see progress
    }

    Thread.sleep(1);
}

Если вы хотите распечатать данные, считываемые из выходных потоков процесса, вы можете сделать это следующим образом:

System.out.print((char)in.read()); // read() returns int, convert it to char
  • 0
    Чтобы проверить возвращаемые значения, мне просто нужно распечатать in.read ()?
  • 0
    @JoseRamon Просто напечатайте его как символ, например, System.out.print((char)in.read()); ,
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню