console.writeline和System.out.println
console.writeline
和System.out.println
的技术区别是什么? 我知道System.out.println
写入到标准输出,但这是不是一样的东西作为控制台?
我不完全了解console.writeline
的文档 。
以下是使用System.out
/ .err
/ .in
和System.console()
之间的主要区别:
- 如果您的应用程序未在terminal中运行,则
System.console()
将返回null( 尽pipe您可以在应用程序中处理该应用程序 ) -
System.console()
提供读取密码而不回显字符的方法 -
System.out
和System.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
的观点。