使用Java Scanner时PowerShell控制台无法立即打印上一行的问题求助
问题描述
- 编写的Java程序通过
Scanner获取用户名、Console类获取密码,在Windows 11的PowerShell中执行时出现异常:- 程序启动显示
User: foo|[<---BLINKING CURSOR] - 第一次按回车后,控制台变为
|[<---BLINKING CURSOR]User: foo - 第二次按回车后,才正常显示用户名并进入密码输入环节
- 程序启动显示
- 该问题仅出现在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
相关产品推荐
相关产品推荐

