通过双击运行Java Swing应用程序(不带控制台)

通过双击运行Java Swing应用程序(不带控制台),java,swing,logging,jar,Java,Swing,Logging,Jar,假设我有一个启动Swing GUI的可执行JAR。如果它是从控制台启动的(例如,java-jarmyapp),那么应用程序也会使用控制台(即打印日志)。这个日志记录需要一些时间,非常冗长 请注意,我只有一个JAR,没有源代码 问题:双击运行JAR时会发生什么?显然,没有可见的日志,但它们只是不可见的,还是这确实提高了应用程序的性能(通过跳过日志)?如果您不想看到控制台,请使用javaw来启动程序,而不是java。因此,您可以运行:javaw-jarmyapp.jar如果您打算停止日志记录,可以使

假设我有一个启动Swing GUI的可执行JAR。如果它是从控制台启动的(例如,
java-jarmyapp
),那么应用程序也会使用控制台(即打印日志)。这个日志记录需要一些时间,非常冗长

请注意,我只有一个JAR,没有源代码


问题:双击运行JAR时会发生什么?显然,没有可见的日志,但它们只是不可见的,还是这确实提高了应用程序的性能(通过跳过日志)?

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

如果您打算停止日志记录,可以使用
Logger\setLevel(Level.off)
(假设您使用的是标准日志记录程序)关闭日志记录。如果您的目的是减少日志消息的详细程度,则可以使用Level.WARNING,例如,只记录警告和严重消息。通常,您可以将要记录的最低级别设置为任何级别。 当你的应用程序在没有控制台的情况下启动时,它通常没有连接控制台(但我认为这是一个平台问题,例如,我认为有些平台可能提供中央控制台,而在servlet容器中运行的Java web应用程序,即使容器是从控制台启动的,通常也没有连接控制台)所以我不会因为任何原因把我的密码押在上面。
如果您仍然希望您的日志在运行时不附带
控制台的应用程序中,您可以始终使用
记录器#addHandler(FileHandler)
将日志消息重定向到文件,通常
系统。out.println()
不适合用于日志记录。这是一个IO操作,非常耗时。如果需要关闭,则需要在代码中手动注释


使用log4j或java Logger。

System.out.prinln()
打印到进程的输出流。JVM不知道也不关心输出的实际去向。它可以是控制台,也可以重定向到文件,或者通过管道传输到另一个进程,或者不发送到任何地方。指令是一个阻塞操作,因此指令所花费的时间取决于它实际运行的位置。打印到控制台比打印到文件慢,打印到文件比不打印到任何地方慢。

这样做时会发生什么?你注意到速度上的差异了吗?很难说,在这两种情况下,操作持续1-2秒..1秒还是2秒?为什么不先用日志和控制台进行测量,然后用日志和控制台进行测量,然后根本不用日志。这将告诉您是否需要关心它。这是一个一般性问题(控制台是否会减慢应用程序的速度)-而不是任何特定的应用程序。是的,操作已执行。操作系统决定stdout必须去哪里。您可以将输出通过管道传输到另一个进程,或者将其重定向到一个文件,而JVM对此一无所知。写入控制台比写入文件慢,写入文件比不写入任何地方都慢。如果不是通过IO操作,log4j如何将日志写入控制台?@elmes:vels4j的意思是,我认为,使用日志记录,您无需注释掉任何代码行即可关闭日志记录并避免这种昂贵的IO操作。我完全理解这一点,但我想使用什么日志库并不重要——它们最终都使用标准I/O(如果它们被配置为写入控制台)。此外,有些库(例如log4j)可能会连接记录的
字符串
s,即使记录级别低于要求,这也是很昂贵的。@JBNizet我说过,需要像//System.out.print()这样的注释,而不适用于记录器。此外,在logger中,可以使用
Level
s,如FINE、INFO、DEBUG等,意思是它的级别为4j,如log4j:-)我不知道
javaw
,+1:-)@elmes javaw也是双击jar时用来运行jar的程序!