Windows上的System.err在哪里?

时间:2010-01-18 00:11:50

标签: java windows stdout stderr

我有一个基于Java GUI的应用程序,它将一些诊断消息写入System.out和System.err。在Windows上运行时,这些消息输出在哪里? (例如,在Mac OS X上,它们将打印到系统控制台日志中。)

修改

我应该补充一点,Java应用程序打包为.exe,所以(现在)我无法使用java启动它。 (我想,我可以将各个.JAR文件复制到Windows测试机器上。)

此外,它是我继承的应用程序之前没有使用过日志框架;我想修改它以使用一个,但我希望能够快速获得一些日志输出来诊断问题。

6 个答案:

答案 0 :(得分:6)

您实际上可以使用setout()setErr()更改应用程序中System.out和System.err指向的位置。

因此,对于exmaple,如果要转储到文件,则可以执行

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

只需在main(String[] args)进行一次即可,你应该好好去。

答案 1 :(得分:3)

AFAIK如果您使用java.exe启动Java应用程序,它们将被写入控制台。如果使用javaw.exe启动它,它们就无处可去,因为标准输入/输出/错误不会重定向到GUI应用程序。 (您可以手动为javaw.exe创建一个子流程并重定向输出,但我认为这超出了范围)

我建议使用一些日志框架,然后将消息写入日志文件。 log4jjava.util.logging将是一个良好的开端......

答案 2 :(得分:2)

这实际上取决于您启动应用程序的方式。例如,如果您要从Windows命令行提示符(例如java -jar myApp.jar)启动GUI,那么您可能会发现System.out和System.err都会进入控制台。如果您通过Windows shell本身启动(例如,双击可执行的JAR),那么这些错误流就会丢失,据我所知。设置应用程序作为服务的执行(但在您的情况下听起来不太可能)也会丢失输出流。

在put和output流中使用标准通常不是一个好主意,除非您期望在shell脚本类型环境中调用您的程序,在这种环境中这些是通信的通用通道。正如您自己发现的那样,这些通常在GUI环境中没有很好地定义。如果您确实希望在程序运行时捕获文本信息,请考虑使用“真实”日志记录框架(例如log4j或java.util.logging包)将消息捕获到日志中。

答案 3 :(得分:2)

基于GUI的应用程序,在双击.jar文件时以javaw启动,不会输出System.out和System.err:

Load java.util.logging.config.file for default initialization

  

“javaw”吞下所有输出到System.out和System.err。尝试使用“java”(不使用“w”)。

答案 4 :(得分:1)

如果您通过命令行运行您的类,则会在控制台上打印

System.err条消息。如果你不这样做,你就不会看到这些消息。

答案 5 :(得分:0)

如果使用java运行,则可以使用Java console