console.writeline和System.out.println

console.writelineSystem.out.println的技术区别是什么? 我知道System.out.println写入到标准输出,但这是不是一样的东西作为控制台?

我不完全了解console.writeline的文档 。

以下是使用System.out / .err / .inSystem.console()之间的主要区别:

  • 如果您的应用程序未在terminal中运行,则System.console()将返回null( 尽pipe您可以在应用程序中处理该应用程序 )
  • System.console()提供读取密码而不回显字符的方法
  • System.outSystem.err使用默认的平台编码,而Console类的输出方法使用控制台编码

后者的行为可能不会立即显而易见,但是像这样的代码可以certificate不同之处:

 public class ConsoleDemo { public static void main(String[] args) { String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", "\u2502Hello\u2502", "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" }; for (String s : data) { System.out.println(s); } for (String s : data) { System.console().writer().println(s); } } } 

在我的Windows XP上有一个windows-1252的系统编码和一个IBM850的默认控制台编码,这段代码将写入:

 ??????? ?Hello? ??????? ┌─────┐ │Hello│ └─────┘ 

请注意,此行为取决于将控制台编码设置为与系统编码不同的编码。 由于一系列历史原因,这是Windows的默认行为。

他们基本上是一样的,如果您的程序是从交互式提示运行,而您没有redirect标准input或标准输出:

 public class ConsoleTest { public static void main(String[] args) { System.out.println("Console is: " + System.console()); } } 

结果是:

 $ java ConsoleTest Console is: java.io.Console@2747ee05 $ java ConsoleTest </dev/null Console is: null $ java ConsoleTest | cat Console is: null 

Console存在的原因是提供在从交互式命令行运行的特定情况下非常有用的function:

  • 安全的密码input(难以跨平台)
  • 同步(多个线程可以提示input, Console会很好地排队,而如果你使用System.in/out,那么所有的提示将同时出现)。

注意,即使redirect其中一个stream,也会导致System.console()返回null ; 另一个恼人的是从其他程序(例如Eclipse或Maven)衍生出来的时候通常没有Console对象可用。

首先,我担心你的问题包含一个小错误。 类Console中没有方法writeline。 相反,类Console提供了返回PrintWriter的方法writer()。 这个打印作家有println()。

现在有什么区别

 System.console().writer().println("hello from console"); 

 System.out.println("hello system out"); 

如果你从命令行运行你的应用程序,我认为没有什么区别。 但是,如果控制台不可用System.console()返回null,而System.out仍然存在。 如果您调用应用程序并将STDOUTredirect到文件,则可能发生这种情况。

这是我刚刚实现的一个例子。

 import java.io.Console; public class TestConsole { public static void main(String[] args) { Console console = System.console(); System.out.println("console=" + console); console.writer().println("hello from console"); } } 

当我从命令提示符运行应用程序时,我得到了以下内容:

 $ java TestConsole console=java.io.Console@93dcd hello from console 

但是当我将STDOUTredirect到文件…

 $ java TestConsole >/tmp/test Exception in thread "main" java.lang.NullPointerException at TestConsole.main(TestConsole.java:8) 

第8行是console.writer().println()

这里是/ tmp / test的内容

 console=null 

我希望我的解释有帮助。

Java中没有Console.writeline 。 它在.NET中。

控制台和标准输出不一样。 如果您阅读了您提到的Javadoc页面,则只有从命令行调用应用程序才能访问控制台,并且输出不像这样redirect

 java -jar MyApp.jar > MyApp.log 

其他类似的情况在SimonJ的回答中也有介绍,尽pipe他错过了没有Console.writeline的观点。