console.writeline 和 System.out.println

Posted

技术标签:

【中文标题】console.writeline 和 System.out.println【英文标题】:console.writeline and System.out.println 【发布时间】:2011-04-29 15:43:56 【问题描述】:

console.writelineSystem.out.println 之间的技术区别到底是什么? 我知道System.out.println 写入标准输出,但这与控制台不一样吗?

我不完全理解documentation 的console.writeline

【问题讨论】:

见***.com/questions/2369731/… console.writeline 也不是 java 方法(它是 .net)...但我明白你在问什么 :) 【参考方案1】:

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

如果您的应用程序未在终端中运行,System.console() 将返回 null (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-1252 和默认控制台编码为 IBM850 的 Windows XP 上,此代码将编写:

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

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

【讨论】:

你能举个不在终端运行的例子吗? @Richard,如果您从 IDE 中运行,或者如果您从 GUI 启动可执行 jar。【参考方案2】:

如果您的程序是从交互式提示符运行并且您没有重定向标准输入或标准输出,它们本质上是相同的:

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 对象。

【讨论】:

【参考方案3】:

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

希望我的解释有所帮助。

【讨论】:

为了使代码显示为代码块,每行缩进四个空格。 (不过,我刚刚为你做了。) 但是,有一个 Console.printf 和一个 Console.format,它们都是直接写入的,不需要提取中间的 PrintWriter。奇怪:)【参考方案4】:

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

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

java -jar MyApp.jar > MyApp.log

SimonJ 的回答中涵盖了其他此类情况,尽管他错过了没有 Console.writeline 的观点。

【讨论】:

是的 - 我认为 ziggy 的编译器(或 Javadocs)可以为我完成这项工作:)

以上是关于console.writeline 和 System.out.println的主要内容,如果未能解决你的问题,请参考以下文章

如何包含行号和文件名 Console.WriteLine 输出? [复制]

C#中Console.WriteLine()和Format()方法的异同?

C#里面Console.Write与Console.WriteLine有啥区别????

C#中Console.WriteLine与Response.Write有啥区别

从多个线程调用 Console.WriteLine

Debug.WriteLine() 与 Console.WriteLine() 处理文化的方式不同。为啥?