我曾经使用readLine
ofBufferedReader
来获取用户的输入/新密码,但想屏蔽该密码,所以我尝试使用java.io.Console
class。问题是在Eclipse中调试应用程序时System.console()
返回null
。我是Java和Eclipse的新手,不确定这是否是最好的方法吗?我右键单击源文件,然后选择“调试为”>“ Java应用程序”。有什么解决方法吗?
Answers:
这个代码片段应该可以解决这个问题:
private String readLine(String format, Object... args) throws IOException {
if (System.console() != null) {
return System.console().readLine(format, args);
}
System.out.print(String.format(format, args));
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
return reader.readLine();
}
private char[] readPassword(String format, Object... args)
throws IOException {
if (System.console() != null)
return System.console().readPassword(format, args);
return this.readLine(format, args).toCharArray();
}
在Eclipse中进行测试时,您的密码输入将清晰显示。至少,您将能够进行测试。只是不要在测试时输入您的真实密码。保留供生产使用;)。
readLine
方法是否应该BufferedReader
在finally(或try-with-resources)块中关闭?
System.in
流,并且之后无法再进行读取。
System.console()
如果没有控制台,则返回null。
您可以通过在代码中添加间接层或在外部控制台中运行代码并附加远程调试器来解决此问题。
java -cp ... Class | tee out
。
当尝试编写一个简单的命令行应用程序时,我也遇到了这个问题。
从System.in创建自己的BufferedReader对象的另一种方法是使用java.util.Scanner,如下所示:
import java.util.Scanner;
Scanner in;
in = new Scanner(System.in);
String s = in.nextLine();
当然,这将不是Console的直接替代,而是使您可以访问各种不同的输入功能。
根据文档:
如果虚拟机是自动启动的(例如由后台作业调度程序启动),则该虚拟机通常将没有控制台。
根据API:
“如果从交互式命令行启动虚拟机而不重定向标准输入和输出流,则其控制台将存在,并且通常会连接到键盘并显示启动虚拟机的位置。如果启动虚拟机自动,例如由后台作业调度程序自动执行,则通常没有控制台。”
从Netbeans运行应用程序时收到此错误消息。从其他答案来看,这似乎是从IDE运行应用程序时发生的。如果您看一下这个问题:尝试从Java控制台中读取,那是因为
大多数IDE使用javaw.exe而不是java.exe来运行Java代码
解决方案是使用command line/terminal
来获取Console
。
我相信,在Eclipse的运行配置中,您可以配置是否分配控制台-确保已选中。(自从我使用Eclipse已经有一段时间了,所以我无法给出具体的说明,我担心)。
如果这不起作用,那么肯定可以完成此工作的操作是以调试方式启动应用程序,然后使用Eclipse连接到该进程。如果不确定如何执行此操作,请搜索“ Eclipse远程调试”。
此外,总的来说,要求分配一个控制台是一个坏主意,因为这会极大地影响应用程序的灵活性-正如您刚刚发现的那样。许多调用Java的方法不会分配控制台,并且您的应用程序在这些实例中不可用(这很糟糕)。也许您可以选择在命令行上指定参数。(如果您专门测试控制台输入,那么就足够公平了,但是对于人们来说,能够从脚本和/或无头服务器上调用您的应用程序可能很有用,因此这种灵活的设计几乎总是一个好主意。 。它通常也会导致组织更好的代码。)
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
在VM的参数中添加例如(至少在Sun JVM上)。可以使用控制台,但是要指出的是,如果不使用控制台,则代码根本无法正常工作。相反,考虑通过从命令行参数,系统属性,属性文件等直接采购在价值最起码提供了一些可供选择-例如,只能去到控制台,如果值不作为命令行参数提供。
System.out
并System.in
足以满足我的用例,并使用放弃了System.console()
。