Выполнение программы зависает (возможно, из-за слишком большого количества вывода) - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь запустить программу, игнорируя ее вывод, но кажется, что она зависает, когда ее вывод большой.Мой код выглядит следующим образом:

Process p = Runtime.getRuntime().exec("program");
p.getOutputStream().write(input.getBytes());
p.getOutputStream().flush();
p.getOutputStream().close();
p.waitFor();

Каков наилучший способ игнорировать вывод?

Я попытался перенаправить вывод в / dev / null, но получил исключение Java IOException 'Сломалась труба '.

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Вы пробовали:

Process p = Runtime.getRuntime().exec("program >/dev/null 2>&1");

Я помню, что раньше делал что-то подобное в Java, но, возможно, я не вызывал этот процесс одинаково.

Редактировать: я только что проверил этот код, и он успешно завершен.

class a
{
    public static void main(String[] args) throws Exception
    {
        Process p = Runtime.getRuntime().exec("cat a.java >/dev/null 2>&1");
        p.getOutputStream().write(123123);
        p.getOutputStream().flush();
        p.getOutputStream().close();
        p.waitFor();
    }
}
0 голосов
/ 24 июня 2011

Я бы использовал Stream Gobbler.Подробнее об этом смотрите здесь: Что делать, когда Runtime.exec () не будет

0 голосов
/ 24 июня 2011

Вы не можете "игнорировать" вывод дочернего процесса в Java, по крайней мере, технически.Вы должны прочитать содержимое входного потока, поскольку это не приведет к заполнению выходного буфера на другом конце, что приведет к описанному поведению зависания.Когда дочерний процесс пытается выполнить запись в полный выходной буфер, он блокируется до тех пор, пока буфер не будет очищен путем его чтения.

Если вы не хотите выводить данные, хотя бы прочитайте их и отбросьте. Или используйте NullInputStream .Вам не нужно использовать класс Apache Commons;Вы можете создать свой собственный класс NullInputStream, методы которого read имеют пустые тела, аналогично NullOutputStreams .

Кроме того, эта проблема может быть не решена путем чтения только входного потока.Вам также необходимо прочитать поток ошибок, который может быть перенаправлен во входной поток.

...