3

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

编辑

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

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

4

6 回答 6

6

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

因此,例如,如果您想转储到文件中,您可以这样做

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

只需这样做一次,main(String[] args)你就可以开始了。

于 2010-01-18T03:45:30.163 回答
3

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

我建议改用一些日志框架并将消息写入日志文件。log4j或者java.util.logging将是一个好的开始......

于 2010-01-18T00:17:32.707 回答
2

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

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

于 2010-01-18T00:18:25.070 回答
2

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

加载 java.util.logging.config.file 进行默认初始化

“javaw”将所有输出吞入 System.out 和 System.err。改用“java”(不带“w”)。

于 2010-01-18T00:19:01.020 回答
1

System.err如果您通过命令行运行您的课程,消息将打印在控制台上。否则,您将看不到这些消息。

于 2010-01-18T00:16:46.653 回答
0

如果使用 java 运行,您可以使用Java 控制台

于 2010-01-18T06:26:08.520 回答