IT-Swarm.Net

console.writeline和System.out.println

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

我不完全理解 documentation for console.writeline

110
ziggy

以下是使用 System.out/.err/.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上的默认行为。

114
McDowell

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

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

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

注意上面重定向偶数 一个 的流导致System.console()返回nullname__;另一个恼人的是,当从另一个程序(例如Eclipse或Maven)生成时,通常没有Consolename__对象可用。

14
SimonJ

首先,我担心你的问题包含一些错误。类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

我希望我的解释有所帮助。

6
AlexR

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

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

Java -jar MyApp.jar > MyApp.log

SimonJ的答案涵盖了其他此类案例,但他错过了没有Console.writeline的观点。

2
Nithesh Chandra