双击运行Java Swing应用程序(无控制台)

4
假设我有一个可执行的JAR文件,启动了一个Swing GUI。如果它从控制台启动(例如java -jar myapp),那么应用程序也使用控制台(即正在打印日志)。这种记录需要一些时间,而且非常冗长。
注意,我只有一个JAR文件,没有源代码。
问题:当您双击运行一个JAR文件时会发生什么?显然,没有日志可见,但是它们只是不可见,还是确实提高了应用程序的性能(通过跳过日志记录)?

1
当你这样做时会发生什么?你是否注意到速度上的差异? - JB Nizet
很难说,在这两种情况下,操作持续1-2秒。 - emesx
1或2秒?为什么不用日志和控制台进行测量,然后再用日志但不使用控制台,最后完全不使用日志。这将告诉您是否需要关注它。 - JB Nizet
2
是的,操作已执行。操作系统决定 stdout 必须去哪里。您可以将输出导入到另一个进程中,或将其重定向到文件中,而 JVM 并不知道此事。写入控制台比写入文件慢,而写入空缺更慢。 - JB Nizet
好的,就JVM而言,将println输出到控制台窗口和“无处”是完全相同的吗?顺便说一下,请将所有这些聊天内容都形成一个答案,以便我可以在SO上接受它。 - emesx
显示剩余3条评论
4个回答

4

如果你不想看到控制台,可以使用javaw来启动程序,而不是使用java。因此,你需要运行:javaw -jar myapp.jar


我不知道javaw,+1 :-) - emesx
1
@elmes javaw是运行JAR文件的程序,当您双击它时也会使用它! - John Farrelly

3
如果您想停止记录日志,可以使用Logger#setLevel(Level.OFF)来关闭日志记录(假设您正在使用标准记录器)。如果您想减少日志消息的冗长程度,例如只记录WARNING和SEVERE消息,则可以使用Level.WARNING。通常,您可以将要记录的最小级别设置为任何级别。
当您的应用程序在没有控制台的情况下启动时,通常没有附加到它上面的Console(但我认为这是一个平台问题,例如,某些平台可能提供中央控制台,而即使容器从控制台启动,运行在servlet容器中的Java Web应用程序通常也不会有附加的控制台),因此出于任何原因,我不会在我的代码上打赌。
如果您仍然希望在运行时没有附加Console的应用程序中记录日志,则始终可以使用Logger#addHandler(FileHandler)将日志消息重定向到文件中。

2
通常情况下,不建议使用System.out.println()进行日志记录。这是一项IO操作,会消耗时间。如果需要关闭,则需要在代码中手动注释。
应该使用log4j或java Logger进行日志记录。

如果不是通过IO操作,log4j如何将日志写入控制台? - emesx
@elmes:我认为vels4j的意思是,使用日志记录,您无需注释任何代码行即可关闭日志记录并避免这种昂贵的IO操作。 - JB Nizet
1
我完全理解这一点,但我猜使用哪个日志库并不重要 - 它们最终都会使用标准I/O(如果它们被配置为写入控制台)。此外,一些库(例如log4j)即使日志级别低于所需级别,也可能连接已记录的字符串 - 这是代价高昂的。 - emesx
@JBNizet 我说过,需要像 //System.out.print() 这样的注释,而不是用于记录器。此外,在记录器中可以使用 Level,例如 FINE、INFO、DEBUG 等,这意味着 vels4j 就像 log4j 一样 :-) - vels4j

1

System.out.prinln() 打印到进程的输出流。JVM 不知道也不关心输出实际上去了哪里。它可能是控制台,也可能被重定向到文件,或者被管道传输到另一个进程,或者被发送到无处。该指令是阻塞操作,因此指令所需的时间取决于它实际上去了哪里。打印到控制台比打印到文件慢,而打印到无处则更慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接