我知道,像Git的命令行界面和其他人能够从(口令有用)的用户隐藏输入。 有没有办法来programmtically做到这一点在Java中? 我是从一个用户正在输入密码,我想他们的投入是这一特定线路上“隐藏”(但不是全部)。 这里是我的代码,它(虽然我怀疑这将是有益的...)
try (Scanner input = new Scanner(System.in)) {
//I'm guessing it'd probably be some property you set on the scanner or System.in right here...
System.out.print("Please input the password for " + name + ": ");
password = input.nextLine();
}
尝试java.io.Console.readPassword
。 你必须至少运行Java 6中虽然。
/**
* Reads a password or passphrase from the console with echoing disabled
*
* @throws IOError
* If an I/O error occurs.
*
* @return A character array containing the password or passphrase read
* from the console, not including any line-termination characters,
* or <tt>null</tt> if an end of stream has been reached.
*/
public char[] readPassword() {
return readPassword("");
}
要小心的是,这不起作用与Eclipse控制台。 你必须从一个真正的控制台/外壳/终端/提示能够测试运行程序。
是可以做到的。 这就是所谓的命令行输入屏蔽。 您可以轻松地实现这一点。
你可以使用一个单独的线程中正在进入他们抹去呼应人物,并用星号代替他们。 这是使用如下所示的EraserThread类完成
import java.io.*;
class EraserThread implements Runnable {
private boolean stop;
/**
*@param The prompt displayed to the user
*/
public EraserThread(String prompt) {
System.out.print(prompt);
}
/**
* Begin masking...display asterisks (*)
*/
public void run () {
stop = true;
while (stop) {
System.out.print("\010*");
try {
Thread.currentThread().sleep(1);
} catch(InterruptedException ie) {
ie.printStackTrace();
}
}
}
/**
* Instruct the thread to stop masking
*/
public void stopMasking() {
this.stop = false;
}
}
如果使用这种线
public class PasswordField {
/**
*@param prompt The prompt to display to the user
*@return The password as entered by the user
*/
public static String readPassword (String prompt) {
EraserThread et = new EraserThread(prompt);
Thread mask = new Thread(et);
mask.start();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String password = "";
try {
password = in.readLine();
} catch (IOException ioe) {
ioe.printStackTrace();
}
// stop masking
et.stopMasking();
// return the password entered by the user
return password;
}
}
此链接详细讨论。
的JLine 2可能会感兴趣的。 和字符屏蔽,它会提供的命令行完成,编辑和历史的设施。 因此它是一个基于命令行的Java工具是非常有用的。
为了掩盖你输入:
String password = new jline.ConsoleReader().readLine(new Character('*'));
有 :
Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:")) != null) {
...
java.util.Arrays.fill(passwd, ' ');
}
资源
但我不认为这有工作像Eclipse的IDE,因为程序运行的后台进程,而不是一个控制台窗口的顶级工艺。
另一种方法是使用JPasswordField
的摆动与随附actionPerformed
方法:
public void actionPerformed(ActionEvent e) {
...
char [] p = pwdField.getPassword();
}
资源
该类控制台有一个方法readPassword()
可能会解决您的问题。