Где находится System.err в Windows?

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

Изменить

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

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


person mipadi    schedule 18.01.2010    source источник
comment
Ой, JAR как EXE. Зачем ограничивать независимую от платформы программу одной платформой?   -  person BalusC    schedule 18.01.2010
comment
Упаковка — в процессе сборки может быть создано приложение для Mac OS X или набор файлов JAR для Linux (или приложение для запуска через Интернет).   -  person mipadi    schedule 18.01.2010


Ответы (6)


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

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

person Andrzej Doyle    schedule 18.01.2010
comment
Все хорошие ответы, но я думаю, что это самый подробный. Я также решил увеличить план по использованию фреймворка ведения журналов, так что я думаю, что это был лучший совет. - person mipadi; 18.01.2010

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

Так, например, если вы хотите сделать дамп в файл, вы можете сделать

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

Просто сделайте это один раз в main(String[] args), и все будет готово.

person Chad Okere    schedule 18.01.2010
comment
Это хорошая идея. Я думал об этом, но в итоге решил использовать реальную структуру ведения журнала. Я все равно планировал это сделать... только не прямо сейчас, но, увы. В любом случае, спасибо за хороший ответ! - person mipadi; 18.01.2010

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

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

person MartinStettner    schedule 18.01.2010

Приложения с графическим интерфейсом, запущенные с помощью javaw при двойном щелчке файла .jar, не будут выводить System.out и System.err:

Загрузить java.util.logging.config.file для инициализации по умолчанию< /а>

"javaw" проглатывает весь вывод в System.out и System.err. Вместо этого попробуйте "java" (без "w").

person Pindatjuh    schedule 18.01.2010

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

person cd1    schedule 18.01.2010

Вы можете использовать консоль Java если бы он запускался с java.

person Turing    schedule 18.01.2010