console.writeline and System.out.println

2022-08-31 08:24:25

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

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


答案 1

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

  • System.console()如果您的应用程序未在终端中运行,则返回 null(尽管您可以在应用程序中处理此问题))
  • System.console()提供了在不回显字符的情况下读取密码的方法
  • System.out并使用默认平台编码,而类输出方法使用控制台编码System.errConsole

后一种行为可能不会立即显现出来,但像这样的代码可以证明其中的区别:

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上的默认行为,原因有很多历史原因。


答案 2

如果您的程序是从交互式提示符运行的,并且您没有重定向 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

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

请注意,即使重定向其中一个流也会导致返回 ;另一个恼火的是,当从另一个程序(如Eclipse或Maven)生成时,通常没有可用的对象。System.console()nullConsole


推荐