Java: программирование stdout и stderr для какого-либо обработчика
Есть ли способ захватывать stdout и stderror моей программы Java построчно?
Возможно, что-то похожее на то, как вы можете добавить обработчик к экземпляру Logger, используя addHandler
,
редактировать: я не хочу заменять обработчики по умолчанию - мне все еще нужно, чтобы вывод отображался в командной строке.
3 ответа
Используя System.setOut () и System.setErr(), вы можете установить стандартный вывод и поток ошибок для любого PrintStream и захватывать все.
ДОПОЛНЕНИЕ: Я не знаю, существует ли какой-нибудь элегантный способ сделать это, но один из способов сделать это:
1. Сохранить выходной поток по умолчанию
PrintStream defaultOut = System.out;
(System.getOut () было бы интересно иметь хотя)
2. Перенаправьте System.out на нужный вам поток печати (например, любой файл).
3. Вместо использования System.out.println () используйте функцию печати, которая выполняет следующие действия:
print (Объект o) {
defaultOut.println (o); // Предполагается, что defaultOut видим в этой функции
System.out.println (о);
}
Методы System.setOut
а также System.setErr
позволит вам изменить PrintStream
объекты, которые System.out
а также System.err
переменные относятся к. Вы можете использовать их для замены по умолчанию PrintStream
объекты с объектами, которые захватывают вывод, или делайте с ним что хотите.
СЛЕДОВАТЬ ЗА
Я не хочу заменять PrintStreams, потому что мне все еще нужен вывод для перехода в командную строку.
Ваш код может позаботиться об этом:
- Создать подкласс
OutputStream
который записывает весь вывод в другойOutputStream
экземпляр, а также фиксирует вывод. Сделайте "другой" экземпляр параметром constructort. - Получить текущие значения
System.out
а такжеSystem.err
, - Создайте свой подкласс дважды,
System.out
а такжеSystem.err
значения в качестве параметров конструктора соответственно. - Оберните эти два экземпляра как
PrintStream
экземпляров. - Вызов
System.setOut
а такжеSystem.setErr
заменитьSystem.out
а такжеSystem.err
сPrintStream
экземпляров.
Консоль сообщений позволяет отображать вывод в текстовой панели и отображать его в командной строке.