2014-09-11 2 views
2

Я пытаюсь запустить команды с использованием Runtime.getRuntime.exec() в Java.java.io.IOException: труба закрывается, она бросается в Windows, но отлично работает в Linux

Runtime r = Runtime.getRuntime(); 
Process process = r.exec("telnet 172.16.221.87 "); 
InputStream is = process.getInputStream(); 
OutputStream os = process.getOutputStream(); 
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os)); 
br.write("ditech\r\n"); 
br.flush(); // The exception is coming on last line that is br.flush(); 

Когда я запускаю код в Linux, тогда его работа отлично. Но когда такой же код запускается в Windows, он вызывает следующую ошибку:

java.io.IOException: The pipe is being closed 
     at java.io.FileOutputStream.writeBytes(Native Method) 
     at java.io.FileOutputStream.write(Unknown Source) 
     at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
     at java.io.BufferedOutputStream.flush(Unknown Source) 
     at sun.nio.cs.StreamEncoder.implFlush(Unknown Source) 
     at sun.nio.cs.StreamEncoder.flush(Unknown Source) 
     at java.io.OutputStreamWriter.flush(Unknown Source) 
     at java.io.BufferedWriter.flush(Unknown Source) 
     at com.telnet.ConnectToTelnet.doTelnet(ConnectToTelnet.java:132) 
     at com.telnet.ConnectToTelnet.main(ConnectToTelnet.java:16) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
+0

Возможно, проблема с брандмауэром –

+1

@ScaryWombat Это предотвратит соединение, а не прерывает операцию ввода-вывода. OP вам придется опубликовать код. – EJP

+0

Брандмауэр выключен. –

ответ

0

Вам необходимо прочитать выход процесса. Он почти наверняка рассказал вам что-то, что вы проигнорировали, нажав вперед на фазу входа. Вам нужно либо запустить два отдельных потока, чтобы прочитать stdout и stderr,, либо использовать классы Process и ProcessBuilder, объединить stderr и stdout и использовать один поток.

Имейте нить, просто напечатайте вывод на данный момент. Это точно скажет вам, что такое текущая проблема. В более общем случае вы должны дождаться приглашения login: перед написанием имени пользователя, дождитесь приглашения password: перед записью пароля и т. Д. Для всех других вещей, которые вы собираетесь делать в этом сеансе Telnet: и если вы получите что-то неожиданное необходимо соответствующим образом реагировать.

Только слепо выталкивание выходных данных в процессах приведет только к таким головоломкам, как этот.

+0

Я жду приглашения, а затем предоставил имя пользователя и тому подобное в случае пароля. Но решения не получилось. –