2010-10-23 32 views
91

console.writelineSystem.out.println之间的技术差异究竟是什么? 我知道System.out.println写入标准输出,但这是不是与控制台是一回事?console.writeline和System.out.println

我不完全了解documentation对于console.writeline

+1

请参阅http://stackoverflow.com/questions/2369731/java-console-applications-is-system-out-still-the-way-to-go – 2010-10-23 18:39:12

+3

也console.writeline不是一个Java方法(这是.net)...但我明白你在问什么:) – 2010-10-23 18:41:58

回答

100

下面是使用System.out/.err/.in和之间的主要不同之处:

  • System.console()返回零,如果应用程序没有在终端(though you can handle this in your application
  • System.console()提供用于读取密码,而不回显字符
  • 方法运行
  • System.outSystem.err使用默认平台编码,而Console类输出方法使用控制台编码

后者的行为可能不会立即明显,但这样的代码可以证明的区别:

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具有窗口1252的系统编码和一个默认的控制台编码IBM850,此代码将写入:

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

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

+0

你能举一个没有在终端上运行的例子吗? – Chao 2015-02-17 07:38:14

+0

@Richard,如果您从IDE运行,或者如果从GUI启动可执行jar。 – aioobe 2016-05-09 11:12:55

10

他们基本上是相同的,如果你的程序从一个交互式提示符下运行,并且您还没有重定向标准输入和标准输出:

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

结果:

$ java ConsoleTest 
Console is: [email protected] 
$ java ConsoleTest </dev/null 
Console is: null 
$ java ConsoleTest | cat 
Console is: null 

原因Console存在的目的是提供在您从交互式命令行运行的特定情况下有用的功能:

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

注意,重定向甚至一个在System.console()流结果返回null以上;另一个令人烦恼的是,当从其他程序(例如Eclipse或Maven)衍生出来时,通常没有可用的对象(Console)。

2

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

控制台和标准输出不一样。如果你读你的Javadoc页mentioned,你会看到一个应用程序可以访问控制台只有当它是通过命令行调用,并且输出不重定向这样

java -jar MyApp.jar > MyApp.log 

其他这样的情况下被覆盖在SimonJ的回答中,尽管他错过了没有Console.writeline这一点。

+0

是的 - 我认为ziggy的编译器(或Javadocs)可以为我做这个工作:) – SimonJ 2010-10-23 19:00:55

5

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

现在是什么

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

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

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

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

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 
[email protected] 
hello from console 

但是当我重定向标准输出到文件...

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

8号线是console.writer().println()

这里的/ tmp /测试

console=null 

的,我希望我的解释帮助的内容。

+0

要导致代码显示为代码块,缩进每行有四个空间。 (尽管我刚刚为你完成了这个工作。) – BoltClock 2010-10-23 18:58:37

+0

但是,有一个Console.printf和一个Console.format,它们都可以直接写入,而不需要提取介入的PrintWriter。奇怪:) – 2015-03-20 02:05:11