答案 1
以下是使用 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
如果您的程序是从交互式提示符运行的,并且您没有重定向 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()
null
Console
推荐
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-
标签
推荐