2015-09-16 2 views
3

Java 8 здесь. Как считывать данные в Process#getOutputStream() в строку? Я пытаюсь запустить процесс изнутри Java и захватить его STDOUT.Java-процесс getOutputStream для строки

Runtime runtime = Runtime.getRuntime(); 
Process proc = runtime.exec("consul -v"); 
String capturedOutput; 

OutputStream os = proc.getOutputStream(); 
capturedOutput = howDoIConvert(os); // <---- ??? 

В поисках точного кода здесь (а не что-то расплывчатое, как baos.toString(codepage). Также интересно, если мне нужно close() что-нибудь вежливо.

ответ

8

Вы читаете данные из InputStream не из OutputStream.

OutputStream является используемый для передачи данных в процесс.

Существует два основных входных потока для Process. Один из них предназначен для стандартного ввода и может быть получен с помощью getInputStream() другой на наличие ошибок и могут быть получены с getErrorStream()

От Javadoc из getInputStream():

Возвращает входной поток, подключенный к обычному выходу подпроцесса

и от getErrorStream()

Возвращает входной поток, подключенный к выходу ошибки подпроцесса .

Обратите внимание на потоки: с точки зрения Java программы A Process является внешняя программа. Когда вам нужно добавить какой-либо ввод во внешнюю программу, вы пишете из java в эту программу (так что выход java-программы является входом Process). Вместо этого, если внешняя программа записывает что-то, что вы читаете (так что выход Process является входом для java-программы).

Java     Data direction External Process 
_____________________________________________________________ 

write to OutputStream ------------> read from InputStream 
read from InputStream <------------ write to OutputStream 
+0

Thanks @David Lorenzo MARINO (+1) - вы, кажется, правы, но для меня это ужасно выглядит назад. Приложение, которое я запускаю изнутри Java (в данном конкретном случае, Consul) записывается в STDOUT. Я бы * подумал, что «оболочка Java' Process' »Consul сделает STDOUT доступным через« OutputStream »(это поток символов, отправленных из Consul ** out ** в STDOUT). Это правильно, и когда я могу дать вам зеленый чек за несколько минут, я сделаю это, но для богов Java я говорю это: * проклинайте вас, о, боги Java, у вас есть это в обратном направлении !!! * – smeeb

+0

Я добавил примечание, чтобы объяснить, почему то, что представляет собой вход, действительно является выходным и наоборот –

Смежные вопросы