У меня есть фрагмент следующим образом:
Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String line = br.readLine();
Теперь в приведенном выше коде я уверен, что процесс всегда будет иметь линейный ввод, поэтому я не использовал какой-либо цикл while или любую нулевую проверку. Проблема заключается в readLine-блоках. Единственной причиной, о которой я знал, является поток, не имеющий данных для чтения и, следовательно, readLine продолжает ждать. Чтобы проверить это, я удалил readLine и использовал функцию read() следующим образом:
Process proc = Runtime.getRuntime().exec( command );
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
int a;
while((a=br.read())!=-1){
char ch = (char) a;
if(ch == '\n')
System.out.print("New line "+ch);
if(ch == '\r')
System.out.print("Carriage return "+ch);
System.out.print(ch);
}
К моему удивлению, этот код работал и печатал сообщения messags New line и Carriage. Теперь мне интересно, почему блок readLine? Доступны данные, которые завершаются новой строкой. Что еще может быть причиной?
Примечание: вышеописанное работало время от времени! Может быть, один раз из 15 раз.
Примечание. Я также попытался использовать ProcessBuilder, но такое же поведение.
UPDATE: Поэтому я переключился на ProcessBuilder, а затем перенаправил errorStream, и теперь я получаю как поток ввода, так и поток ошибок сразу, когда я обрабатываю process.getInputStream, и это отлично работает. Ниже приведен фрагмент.
ProcessBuilder pb = new ProcessBuilder(command.split(" "));
pb..redirectErrorStream(true);
Process proc = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = br.readLine();
//Now I get both input and error stream.
Я хотел бы отличить поток ошибок от потока ввода, но с помощью этого метода они все запутались! Любые идеи по этому поводу?