Удаление Стандартной ошибки в Java
-
09-06-2019 - |
Вопрос
При запуске процесса из Java как stderr, так и stdout могут блокировать вывод, если я не читаю из каналов.В настоящее время у меня есть поток, который активно считывает данные из одного, а основной поток блокирует другой.
Есть ли простой способ объединить два потока или иным образом продолжить подпроцесс, не теряя данных в stderr?
Решение
Установите свойство redirectErrorStream в ProcessBuilder для отправки выходных данных stderr в стандартный вывод:
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Затем вы должны создать поток для работы с потоком процесса, что-то вроде следующего:
Process p = builder.start();
InputHandler outHandler = new InputHandler(p.getInputStream());
Где InputHandler определяется как:
private static class InputHandler extends Thread {
private final InputStream is;
private final ByteArrayOutputStream os;
public InputHandler(InputStream input) {
this.is = input;
this.os = new ByteArrayOutputStream();
}
public void run() {
try {
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
} catch (Throwable t) {
throw new IllegalStateException(t);
}
}
public String getOutput() {
try {
os.flush();
} catch (Throwable t) {
throw new IllegalStateException(t);
}
return os.toString();
}
}
В качестве альтернативы, просто создайте два InputHandlers для InputStream и ErrorStream.Знание того, что программа заблокирует, если вы их не прочтете, составляет 90% успеха :)
Другие советы
Просто есть два потока, один для чтения из стандартного вывода, другой из stderr?