Writeline 和 System.out.println

console.writelineSystem.out.println在技术上到底有什么不同? 我知道 System.out.println写到标准输出,但是这和控制台不是一回事吗?

我不完全理解 console.writeline文件

481999 次浏览

它们本质上是一样的,如果你的程序是从一个交互式提示符运行的,而你没有重定向 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; 另一个恼人的问题是,当从另一个程序(如 Eclipse 或 Maven)产生时,通常没有可用的 Console对象。

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

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

java -jar MyApp.jar > MyApp.log

SimonJ 的回答中也提到了其他类似的情况,尽管他忽略了一点,那就是没有 Console.writeline

首先,恐怕你的问题有点误会。控制台类中没有方法写线。相反,Console 类提供了返回 PrintWriter 的方法 writer ()。这个打印机编写器具有 println ()。

现在告诉我

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

还有

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

如果从命令行运行应用程序,我认为没有区别。但是,如果控制台不可用,System.sole ()返回 null,而 System.out 仍然存在。如果调用应用程序并将 STDOUT 重定向到 file,就可能发生这种情况。

下面是我刚刚实现的一个示例。

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

希望我的解释能有帮助。

以下是使用 ABC0/ABC1/.inSystem.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 上的默认行为。

System.out引用 PrintStream 的一个实例。

System.console.writer引用 PrintWriter 的一个实例。

参见 Println VS PrintWriter