Java控制台应用程序:System.out仍然是最佳选择吗?

9

使用System.out(及相关内容)总是感觉很尴尬,因为它是一个公共字段,而且最新版本的Netbeans会明确提示“应删除语句”。

因此我的问题是:是否仍然推荐使用System.out来写入控制台,或者是否有其他API更值得优先考虑?

编辑:我不是想用于记录日志,而是用于简单的控制台应用程序。类似于ps将正在运行的进程打印到控制台。

4个回答

12

在设计成可从命令行运行的命令中,我认为使用 System.outSystem.err 进行输出,并用于用户可以合理预期理解的错误消息是合理的。如果您正在从良好的shell或脚本运行应用程序,则System.out和/或System.err流可能会被重定向到文件或管道中的另一个进程,但这取决于用户的选择。

在JDK 1.6及更高版本中,java.io.Console使您的应用程序可以访问控制台。虽然在Javadoc中没有明确说明,但我怀疑java.io.Console会打开一个新的流到控制台,因此无法重定向。(相当于在旧式UNIX系统上打开“/dev/tty”)只有在应用程序希望确定它正在与用户交谈且没有任何重定向可能性时才应使用此选项;例如,在请求和读取密码时。

请注意,Console不能保证工作。实际上,据观察,当您从Eclipse运行应用程序时,它不起作用...以及可能其他IDE。

但是,如果您的应用程序是GUI命令,特别是如果它旨在作为无人值守服务运行,则应避免“写入控制台”,因为:

  • 控制台流(System.{out,err}java.io.Console)可能未连接任何内容;或者
  • 用户可能由于控制台窗口被隐藏而未注意到控制台输出1;或者
  • 控制台输出可能会让用户感到恼火,特别是如果您的应用程序没有提供抑制它的方式。

1-根据控制台输出的性质,这实际上可能正是用户想要的。但是应用程序员需要考虑到这一点。


5

是的,主要原因在于没有其他方法可以向控制台写入内容。即使您使用日志框架,最终也会使用System.out


-2
我不建议直接写入控制台。通过使用log4j(或类似的)框架,您可以配置输出的位置,而无需更改代码。

1
他想要写入控制台,没有人提到日志记录。 - whiskeysierra
我之前也没提到日志 :) 使用一个日志框架来写入控制台可以给自己带来更多的灵活性。直接写入 System.out 是不灵活的,即使是针对简单的控制台应用程序。例如,您可能有一个命令开关来更改输出位置,或者更改输出级别的选项。 - objects
3
好的,但是为了这个目的使用日志框架(如你提到的log4j)感觉像是在进行黑客攻击。 - whiskeysierra

-2

只需使用一个日志框架,而不是使用System.out,以调试级别记录,并在开发环境(非生产环境)中将输出设置为控制台和日志级别为调试。


10
如果问题包含"log"则返回+1,否则返回-1。 - whiskeysierra
1
我猜你的评论反过来了,所以你点了踩的按钮 :P - Lombo
1
我知道你可能不再使用Stack Overflow了,但是:提问者明确没有记录日志。他们在控制台上打印输出供用户查看,可能是在一个控制台应用程序中。 - CATboardBETA

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