我有一个基于Java GUI的应用程序,它将一些诊断消息写入System.out和System.err。 在Windows上运行时,这些消息在哪里输出? (例如,在Mac OS X上,它们被打印到系统控制台日志中。)
编辑
我应该补充说,Java应用程序打包成.exe,所以(现在)我不能启动它使用java
。 (我想可以将单个.JAR文件复制到Windowstesting机器上。)
另外,这是我inheritance的一个应用程序,之前没有使用日志框架。 我想修改它使用一个,但我希望能够快速获得一些日志输出来诊断问题。
这真的取决于你如何启动你的应用程序。 例如,如果您要从Windows命令行提示符(例如, java -jar myApp.jar
)启动GUI,那么您可能预期System.out和System.err都将转到控制台。 如果您通过Windows外壳本身启动(例如,双击可执行JAR),那么这些错误流将丢失,据我所知。 设置应用程序作为服务的执行(但不太可能听起来在你的情况),也将失去输出流。
在输入和输出流中使用标准通常不是一个好主意,除非您希望在shell脚本类型环境中调用您的程序,而这些环境是通用的通道。 正如你发现自己一样,这些在GUI环境中通常没有很好的定义。 如果您真的想在程序运行时捕获文本信息,请考虑使用“真实”日志框架(例如log4j或java.util.logging
包)来捕获日志消息。
实际上你可以使用setout()和setErr()来更改System.out和System.err指向应用程序的位置。
所以例如,如果你想转储到一个文件,你可以做
System.setOut(new PrintStream("output.txt")); System.setErr(new PrintStream("err.txt"));
只要在main(String[] args)
做一次,你应该很好。
AFAIK如果你使用java.exe
启动你的Java应用程序,它们被写入控制台。 如果您使用javaw.exe
启动它,则它们将无处可用,因为标准的in / out / err不会重定向到GUI应用程序。 (你可以手动为javaw.exe
创建一个子javaw.exe
并重定向输出,但是我认为这超出了范围)
我会建议使用一些日志框架,而不是将消息写入日志文件。 log4j
或java.util.logging
将是一个好的开始…
当双击.jar文件时,以javaw开头的基于GUI的应用程序不会输出System.out和System.err:
加载java.util.logging.config.file以进行默认初始化
“javaw”吞下所有输出到System.out和System.err。 尝试“java”,而不是“w”)。
如果您通过命令行运行您的类, System.err
消息打印在控制台上。 如果你不这样做,你将不会看到这些消息。
如果使用Java运行,则可以使用Java控制台 。