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

使用Java Scanner时PowerShell控制台无法立即打印上一行的问题求助

问题描述
  • 编写的Java程序通过Scanner获取用户名、Console类获取密码,在Windows 11的PowerShell中执行时出现异常:
    1. 程序启动显示User: foo|[<---BLINKING CURSOR]
    2. 第一次按回车后,控制台变为|[<---BLINKING CURSOR]User: foo
    3. 第二次按回车后,才正常显示用户名并进入密码输入环节
  • 该问题仅出现在PowerShell中,CMD运行无异常。

程序代码:

import java.io.Console;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Console console = System.console();
        
        System.out.print("User: ");
        String user = sc.nextLine();
        System.out.println("\r\n");
        System.out.println("User entered was: " + user); //POINT 1
        
        String password = new String(console.readPassword("Enter password: "));
        System.out.println("\r\n");
        System.out.println("Password entered: " + password); //POINT 2
    }
}
可行解决办法

方案1:统一使用Console类处理输入

避免Scanner和Console混合使用导致的输入流冲突,改用Console.readLine()获取用户名:

import java.io.Console;

public class Main {
    public static void main(String[] args) {
        Console console = System.console();
        
        String user = console.readLine("User: ");
        System.out.println("\r\n");
        System.out.println("User entered was: " + user);
        
        String password = new String(console.readPassword("Enter password: "));
        System.out.println("\r\n");
        System.out.println("Password entered: " + password);
    }
}

PowerShell中Scanner和Console对标准输入流的处理逻辑存在冲突,统一用Console类可规避该问题。

方案2:仅用Scanner处理所有输入(密码明文显示)

若必须使用Scanner,可放弃Console的密码隐藏功能,用Scanner.nextLine()获取密码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("User: ");
        String user = sc.nextLine();
        System.out.println("\r\n");
        System.out.println("User entered was: " + user);
        
        System.out.print("Enter password: ");
        String password = sc.nextLine();
        System.out.println("\r\n");
        System.out.println("Password entered: " + password);
    }
}

注意:此方案密码会明文显示,仅适合测试场景,生产环境不建议使用。

方案3:修改PowerShell输入模式

启动程序前执行以下命令,切换PowerShell的输入模式为Emacs:

Set-PSReadLineOption -EditMode Emacs

或临时设置:

$PSReadLineOptions.EditMode = 'Emacs'

PowerShell默认的Windows编辑模式与Java输入处理存在兼容性问题,切换为Emacs模式可解决光标跳转异常。

内容的提问来源于stack exchange,提问作者Z Star

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:15:15