Во-первых, позвольте мне извиниться перед сообществом SO за то, что я пришел к вам с чем-то таким тривиальным. Но я был в этом весь день, и я в конце моей веревки.
В моей программе есть раздел, который требует извлечения текста из входного потока и потока ошибок из процесса, который запускается с помощью Runtime.getrunTime().exec(), и передачи его на стандартный ввод и вывод упорядоченным образом. У меня есть функция, которая, насколько я могу судить, должна работать. Но, похоже, он попадает в ловушку-22, когда он ждет, пока поток сообщит о готовности, но поток завершился и не сообщает. Я сбит с толку. Я не могу придумать другого способа сделать это, который соответствует моим ограничениям, и я довольно скептически отношусь к тому, что такая уловка-22 может существовать.
Вот мой код:
private void forwardStreamtoStd(InputStream in, InputStream err)
throws IOException {
int c = -1;
BufferedReader inReader = new BufferedReader(
new InputStreamReader(in, "US-ASCII"));
BufferedReader errReader = new BufferedReader(
new InputStreamReader(err, "US-ASCII"));
boolean inFinished = false, errFinished = false;
try {
System.out.println("Begin stream read loop...");
while (!inFinished && !errFinished) {
if (!inFinished) {
while (inReader.ready()) {
if ((c = inReader.read()) == -1) {
inFinished = true;
}
else {
System.out.print((char) c);
}
}
}
if (!errFinished) {
while (errReader.ready()) {
if ((c = errReader.read()) == -1) {
errFinished = true;
}
else {
System.err.print((char) c);
}
}
}
}
System.out.println("End stream read loop.");
}
catch (IOException e) {
throw e;
}
finally {
errReader.close();
inReader.close();
}
}
Проблема, по-видимому, заключается в том, что циклы чтения ждут, пока потоки сообщат о готовности, и в результате не видят -1, возвращаемое чтением, сообщающее им, что пришло время выйти. Я пытаюсь избежать блокировки любого потока, чтобы я мог по очереди извлекать из обоих, когда они будут готовы. Однако как я могу поймать конец потока процесса? Я что-то упускаю? Не следует читать отчет о том, что он прочитан, когда у него есть конец потока -1? Процессы заканчиваются, поэтому их потоки должны умирать. Что я здесь делаю неправильно?