You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:02