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, потому что мне все еще нужен вывод для перехода в командную строку.

Ваш код может позаботиться об этом:

  1. Создать подкласс OutputStream который записывает весь вывод в другой OutputStream экземпляр, а также фиксирует вывод. Сделайте "другой" экземпляр параметром constructort.
  2. Получить текущие значения System.out а также System.err,
  3. Создайте свой подкласс дважды, System.out а также System.err значения в качестве параметров конструктора соответственно.
  4. Оберните эти два экземпляра как PrintStream экземпляров.
  5. Вызов System.setOut а также System.setErr заменить System.out а также System.err с PrintStream экземпляров.

Консоль сообщений позволяет отображать вывод в текстовой панели и отображать его в командной строке.

Другие вопросы по тегам