2010-11-25 1 views
1

Есть ли способ захватить stdout и stderror моей программы Java по строкам?Java: программа stdout и stderr для какого-то обработчика

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

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

+0

В чем причина этого требования? Если это для ведения журнала или отладки, вам следует рассмотреть возможность использования структуры ведения журнала, а не stderr и stdout. Если вы находитесь в системе * nix, вы можете просто перенаправить stdout и stderr в файл и зачеркнуть файл ... – beggs 2010-11-25 03:19:55

+0

Я пишу потоковый API, в котором вы можете получить консольный вывод для программы. Таким образом, все, что входит в консоль, также можно рассматривать как поток HTTP. – 2010-11-25 03:33:01

ответ

3

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

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

2

Методы 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.
+0

Я опоздал на 13 секунд :( – 2010-11-25 02:55:13

1

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