2010-01-18 6 views
3

У меня есть приложение на основе графического интерфейса Java, которое записывает некоторые диагностические сообщения в System.out и System.err. Где эти сообщения выводятся при работе в Windows? (Например, на Mac OS X, они напечатаны в журнале системной консоли.)Где находится System.err в Windows?

Редактировать

Я хотел бы добавить, что приложение Java поставляется в виде EXE-файл, так что (сейчас) Я не могу запустить его с помощью java. (Я могу скопировать отдельные файлы .JAR на тестовую машину Windows, я полагаю.)

Кроме того, это приложение, которое я унаследовал, которое ранее не использовало структуру ведения журнала; Я хотел бы изменить его, чтобы использовать его, но я надеялся быстро получить некоторые данные журнала для диагностики проблемы прямо сейчас.

+1

Ouch, JAR as EXE. Зачем ограничивать платформозависимую программу на одну платформу? – BalusC

+0

Упаковка. Процесс сборки может создать Mac OS X.app или набор файлов JAR для Linux (или приложение для веб-запуска). – mipadi

ответ

2

Это действительно зависит от того, как вы запускаете свое приложение. Например, если вы хотите запустить свой графический интерфейс из командной строки Windows (например, java -jar myApp.jar), тогда, как вы могли ожидать, как System.out, так и System.err перейдут на консоль. Если вы запускаете через оболочку Windows (например, дважды щелкнув исполняемый JAR), то эти потоки ошибок будут потеряны, насколько мне известно. Настройка выполнения приложения как службы (как бы маловероятно, что это может звучать в вашей ситуации) также потеряет выходные потоки.

Использование стандарта в потоках ввода и вывода обычно не является хорошей идеей, если вы не ожидаете, что ваша программа будет вызвана в среде типа shell-script, где это общие каналы для связи. Как вы сами обнаружили, они обычно не определены в среде GUI. Если вы действительно хотите захватить текстовую информацию во время работы программы, подумайте о том, чтобы использовать «реальную» структуру ведения журнала (например, log4j или пакет java.util.logging) для захвата сообщений в журнал.

+0

Я обновил свой вопрос для решения этих проблем. – mipadi

+0

Все хорошие ответы, но я думаю, что это самое глубокое. Я также решил поднять план использования системы ведения журнала, поэтому я считаю, что это лучший совет. – mipadi

1

System.err сообщения печатаются на консоли, если вы запускаете свой класс через командную строку. если вы этого не сделаете, вы не увидите эти сообщения.

3

AFAIK, если вы начинаете свое приложение с помощью java.exe, они записываются на консоль. Если вы начинаете с javaw.exe, они никуда не идут, поскольку стандартные входы/выходы/ошибки не перенаправляются для приложений с графическим интерфейсом. (Вы могли бы вручную создать подпроцесс для javaw.exe и перенаправить вывод, но это выходит за рамки, я полагаю)

Я бы предложил использовать некоторую структуру ведения журнала и написать сообщения в файл журнала. log4j или java.util.logging было бы хорошим началом ...

6

Вы можете реально изменить, где System.out и System.err точка приложения с помощью setout() и setErr().

Так exmaple, если вы хотите сбросить в файл, который вы могли бы сделать

System.setOut(new PrintStream("output.txt")); 
System.setErr(new PrintStream("err.txt")); 

Просто сделать это один раз в main(String[] args) и вы должны быть хорошо идти.

+0

+1 Я думаю, что это действительно соответствует потребностям @mipadi. – bryantsai

+0

Это хорошая идея. Я это рассмотрел, но в итоге решил использовать реальную структуру ведения журнала. Я все равно собирался это сделать ... просто не сейчас *, но, увы. В любом случае, спасибо за хороший ответ! – mipadi

Смежные вопросы