Processbuilder без перенаправления StdOut

Можно ли перенаправить поток вывода обратно в процесс или не перенаправить его вообще?

Предыстория: Я пытаюсь запустить исполняемый файл, используя Processbuilder. (Точнее, выделенный сервер / srcds.exe)

В результате запуска его с помощью компоновщика процессов окно консоли этого исполняемого файла остается пустым. Через несколько секунд после запуска исполняемый файл вылетает с ошибкой & quot; CTextConsoleWin32 :: GetLine:! GetNumberOfConsoleInputEvents & quot; потому что его консоль пуста.

 Christian Gollhardt17 апр. 2015 г., 18:52
Странный. ПеренаправлениеStdOut это хорошо для меня. Для меня ваша ошибка возникает только при попытке перенаправитьStdIn, Мой текущий обходной путь используетRCON вместоStdIn.

Ответы на вопрос(2)

Я думаю, вы говорите о создании запущенного процесса. перейти к текущему процессу & apos; стандартный вывод. Если вы используете JDK7, это так просто:

.redirectOutput(ProcessBuilder.Redirect.INHERIT)

Update: (слишком много для комментария) Я думаю, вы в замешательстве. Когда вы запускаете процесс из терминала, процесс становится дочерним по отношению к этому терминальному процессу, и стандартный вывод отправляется этому терминалу. Когда вы запускаете процесс из Java, этот процесс является дочерним по отношению к процессу Java, и его стандартный вывод отправляется в Java.

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

Ваша проблема сейчас не в Java. Ваша проблема не в понимании того, как это & quot; srcds.exe & quot; ожидает обработки стандартного ввода и стандартного вывода. Выясните это, а затем вернитесь и спросите, как это сделать с Java.

Я сейчас только догадываюсь, но вы можете попробовать прочитать из процесса & apos; стандартный вывод и подача его обратно в стандартный ввод. Может быть, это то, что он ожидает? Это звучит безумно, хотя.

 29 мая 2012 г., 19:16
Обновил мой ответ.
 user142251729 мая 2012 г., 15:27
Это не сработало. Теперь он делает то же самое, что просто читает Inputstream и печатает его. Мне нужно, чтобы он НЕ считывал выходные данные, чтобы подпроцесс не получал свои выходные данные «украдены».
 29 мая 2012 г., 16:34
Затем уточните, чего вы пытаетесь достичь. Если вы не прочитаете вывод, это может привести к зависанию вашего порожденного процесса. Это не то, что вы ищете. Выhave to прочитайте процесс & apos; вывод и сделай что нибудь с этим.
 user142251729 мая 2012 г., 20:08
Дело в том, что srcds.exe запускает собственный терминал. Запуск его с помощью java заставляет все содержимое, обычно поступающее в этот терминал, попадать в java (терминал все еще появляется, но остается пустым), а когда он пытается прочитать свой собственный терминал, он падает. Ключ должен запустить процесс без перенаправления Stdout.
 user142251729 мая 2012 г., 17:28
В окне консоли приложения, которое я запускаю, обычно печатается материал. Запустив его с помощью компоновщика процессов, вывод идет в мою Java вместо этого окна консоли. Поскольку это консольное окно остается пустым, приложение вылетает, так как оно ожидает строки там. Что я хочу сделать, так это чтобы строки все еще появлялись в окне консоли подпроцесса, чтобы он не зависал.

вы можете получить вывод, как это

ProcessBuilder pb = new ProcessBuilder(args);
Process p = pb.start(); 

//below code gets the output from the process
InputStream in = p.getInputStream();
BufferedInputStream buf = new BufferedInputStream(in);
InputStreamReader inread = new InputStreamReader(buf);
BufferedReader bufferedreader = new BufferedReader(inread);
String line;
while ((line = bufferedreader.readLine()) != null) {
    *do something / collect output*
}
 29 мая 2012 г., 00:46
Обратите внимание, что в этом случае документация API не поддерживает буферизацию. Посмотреть здесь:docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
 user142251729 мая 2012 г., 02:01
Код, который вы только что дали мне, - это именно тот код, который создает проблему. Это не ответ на мой вопрос.
 29 мая 2012 г., 02:08
@vizier: ваша ссылка немного не работает - она не переходит наgetInputStream(), Тем не менее, обсуждение буферизации вgetInputStream() Документация гласит: «Примечание по внедрению:is хорошая идея для буферизации входного потока. & quot; Возможно, вы хотели обратить наше внимание на вводную документацию (на уровне класса), которая гласит: «Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных потоков ввода и вывода,failure to promptly write входной потокor read выходной поток подпроцесса может вызвать блокировку подпроцесса и даже тупик. & quot; ?

Ваш ответ на вопрос