java console.write_console.writeline和System.out.println

问题

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

我不完全理解documentationforconsole.writeline。

#1 热门回答(108 赞)

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

如果你的应用程序未在终端中运行,System.console()将返回null(尽管你可以在应用程序中处理此问题)

System.console()提供了在不回显字符的情况下读取密码的方法

System.out和System.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上的默认行为。

#2 热门回答(12 赞)

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

Console is: null

$ java ConsoleTest | cat

Console is: null

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

安全密码输入(难以跨平台)

同步(多个线程可以提示输入,Console会很好地排队,而如果你使用System.in/out,那么所有的提示都会同时出现)。

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

#3 热门回答(5 赞)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值