console.writeline和System.out.println


Answers:


130

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

  • System.console()如果您的应用程序未在终端中运行,则返回null(尽管您可以在应用程序中处理此操作
  • 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(系统编码为Windows-1252,默认控制台编码为IBM850)上,该代码将写为:

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

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


您能否获得一个不在终端上运行的示例?
2015年

@Richard,如果从IDE命中运行,或者从GUI启动可执行jar。
aioobe

15

如果您的程序是从交互式提示运行的,并且您没有重定向stdin或stdout,则它们本质上是相同的:

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存在的原因是提供在从交互式命令行运行的特定情况下有用的功能:

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

注意上面的重定向甚至 一个流都会System.console()返回null; 另一个烦恼是Console从其他程序(例如Eclipse或Maven)产生时,通常没有可用的对象。


7

首先,恐怕您的问题包含一个小错误。类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
console=java.io.Console@93dcd
hello from console

但是当我将STDOUT重定向到文件时...

$ 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

希望我的解释有所帮助。


要使代码显示为代码块,请在每行缩进四个空格。(不过,我刚刚为您做了。)
BoltClock

但是,有一个Console.printf和一个Console.format,它们都可以直接写入,而无需提取中间的PrintWriter。奇怪:)
Toby Eggitt 2015年

3

Console.writelineJava中没有。它在.NET中。

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

java -jar MyApp.jar > MyApp.log

SimonJ的答案涵盖了其他此类情况,尽管他错过了一个答案,即没有答案Console.writeline


是的-我认为ziggy的编译器(或Javadocs)可以为我完成这项工作:)
SimonJ 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.