Java: программирование stdout и stderr для какого-либо обработчика - PullRequest
1 голос
/ 25 ноября 2010

Есть ли способ построчно фиксировать stdout и stderror моей Java-программы?

Возможно, что-то похоже на способ добавления обработчика в экземпляр Logger с помощью addHandler.

edit: Я не хочу заменять обработчики по умолчанию - мне все еще нужен вывод для отображения в командной строке.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Используя System.setOut () и System.setErr () , вы можете установить стандартный вывод и поток ошибок для любого PrintStream и захватывать все.

ДОПОЛНЕНИЕ: Я не знаю, существует ли какой-либо элегантный способ сделать это, но один из способов сделать это:
1. Сохранить выходной поток по умолчанию
PrintStream defaultOut = System.out;
(хотя было бы интересно иметь System.getOut ())
2. Перенаправить System.out на нужный вам поток печати (например, любой файл)
3. Вместо использования System.out.println ()используйте вашу функцию печати, которая выполняет следующее:
print (Object o) {
defaultOut.println (o); // Предполагается, что defaultOut видим в этой функции
System.out.println (o);}

2 голосов
/ 25 ноября 2010

Методы System.setOut и System.setErr позволяют изменять объекты PrintStream, к которым относятся переменные System.out и System.err. Вы можете использовать их, чтобы заменить PrintStream объекты по умолчанию объектами, которые захватывают вывод, или делать с ним все, что вы хотите.

Followup

Я не хочу заменять 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 экземпляры.
1 голос
/ 25 ноября 2010

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

...