Java中如何实现输入内容隐藏并将输入替换为星号
Java控制台密码输入隐藏与星号替换实现方案
你当前使用的Scanner类的nextInt()方法会直接回显所有用户输入内容,原生API没有提供关闭回显或者自定义回显内容的配置,所以必须更换输入实现方式,以下是两种可直接复用的实现方案:
方案1:JDK原生无回显实现(仅隐藏明文,无星号)
如果只需要隐藏明文输入,不需要显示星号提示,可直接使用JDK自带的Console类实现,代码最简单且安全性最高:
import java.io.Console; import java.util.Arrays; public class PasswordLogin { public static void main(String[] args) { Console console = System.console(); // IDE的重定向控制台无法获取Console实例,需在原生命令行运行 if (console == null) { System.out.println("请在系统原生命令行终端运行本程序"); System.exit(1); } // readPassword方法默认不会回显任何输入内容 char[] password = console.readPassword("请输入登录密码:"); // 此处替换为你自己的密码校验逻辑 System.out.println("输入完成,密码长度为:" + password.length); // 用完立即清空字符数组,避免密码在内存中残留 Arrays.fill(password, ' '); } }
该方案的特点:
- 优点:官方原生实现无第三方依赖,输入内容不会以字符串形式缓存,安全性更高
- 缺点:仅隐藏输入内容,不会显示星号提示,不支持IDE控制台运行
方案2:自定义回显实现(输入字符实时替换为星号)
如果需要实现输入一个字符显示一个星号、支持退格修正的效果,可通过修改控制台回显规则手动实现:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class StarPasswordLogin { public static void main(String[] args) throws Exception { System.out.print("请输入登录密码:"); String password = readStarPassword(); System.out.println("\n输入完成,你输入的密码为:" + password); // 此处替换为你自己的密码校验逻辑 } private static String readStarPassword() throws Exception { StringBuilder passwordBuf = new StringBuilder(); // 关闭系统控制台默认回显 if (System.getProperty("os.name").startsWith("Windows")) { Runtime.getRuntime().exec("cmd /c @echo off").waitFor(); } else { Runtime.getRuntime().exec("stty -echo").waitFor(); } BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in)); int inputChar; while ((inputChar = inputReader.read()) != -1) { // 回车或换行表示输入结束 if (inputChar == '\n' || inputChar == '\r') { break; } // 处理退格删除逻辑 if (inputChar == '\b' && passwordBuf.length() > 0) { passwordBuf.deleteCharAt(passwordBuf.length() - 1); // 清除已经打印的星号 System.out.print("\b \b"); } else if (inputChar != '\b') { passwordBuf.append((char) inputChar); // 每输入一个字符打印一个星号 System.out.print("*"); } } // 恢复控制台默认回显规则 if (!System.getProperty("os.name").startsWith("Windows")) { Runtime.getRuntime().exec("stty echo").waitFor(); } return passwordBuf.toString(); } }
该方案的特点:
- 优点:完全符合你要求的输入实时显示星号的效果,支持退格删除修正输入,和主流网站密码输入体验一致
- 缺点:需要针对不同操作系统做适配,建议优先在系统原生命令行运行,部分IDE控制台可能不支持回显修改
内容的提问来源于stack exchange,提问作者Optimus Fried
相关产品推荐
相关产品推荐

