我正在使用此简单易懂的代码从控制台读取密码:
String s = new String(System.console().readPassword("Enter password:"));
当我从这样的命令运行时:
$ java Foo
Enter password:
一切都很好。但是,如果我重定向标准输出,则会得到:
$ java Foo > /dev/null
Exception in thread "main" java.lang.NullPointerException
at Foo.main(Foo.java:122)
(第122行是上面显示的那一行)
重定向stdout
应该会杀死控制台,这很奇怪,但是我可以理解为什么会发生这种情况。
我想以某种方式解决此问题,而不是获得NPE,但是我不确定Java中是否有其他设施允许从键盘读取敏感值而无需回显字符。 / p>
还有其他可靠的策略吗?我怀疑我是否可以使用ANSI转义将终端置于特定模式,但是我不知道Java可以提供的可靠性。
答案 0 :(得分:0)
我不知道这是否是您所需要的,但是如果可能的话,您可以像在应用程序开始时一样从控制台加载密码,然后以编程方式将系统输出重定向到其他地方执行
System.setOut(new PrintStream(new OutputStream() {
// don't write to nowhere
public void write(int b) { }
}));
在JDK11中,您可以做
System.setOut(new PrintStream(OutputStream.nullOutputStream()));