使用 java 扫描仪时,为什么我的控制台没有立即打印上一行?

问题描述 投票:0回答:1

我有以下简单的 Java 程序,它要求输入用户名(通过扫描仪)和密码(通过控制台)。请注意,我没有在 Eclipse 等 IDE 中运行此程序,因此该错误不适用于我的情况(特别是我在 powershell 上运行此程序)。我们可能总是假设控制台存在。

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
    }
}

这是我尝试过的/预期的:

当我运行该程序时,它会提示我 [用户:] 正如预期的那样。但是,当我按键盘上的 ENTER 时,它将光标移至行首并且不会继续到“POINT 1”。当我再次按 Enter 键时,我们将继续执行“POINT 1”并按预期显示用户。


运行程序后,控制台如下所示:

[PS C:\..\Password] > java -cp "myBin" Main
User: foo|[<---BLINKING CURSOR]

按一次 ENTER(意外行为!!)

[PS C:\..\Password] > java -cp "myBin" Main
|[<---BLINKING CURSOR]User: foo

再次按 ENTER 键(预期行为)

[PS C:\..\Password] > java -cp "myBin" Main
User: foo

User entered was: foo
Enter password: |[<---BLINKING CURSOR]

输入密码“bar”并第三次按 ENTER(预期行为)

[PS C:\..\Password] > java -cp "myBin" Main
User: foo

User entered was: foo
Enter password: <non-echoed characters 'bar'>


Password entered: bar
[PS C:\..\Password] > |[<---BLINKING CURSOR] #program ended at "POINT 2".

编辑:尝试这是CMD(Windows 11)后,似乎问题是powershell......有人有解决方法吗?

java io java.util.scanner
1个回答
0
投票

Java 的

System.out
是缓冲的,这意味着输出不一定会立即显示。当您使用
System.out.print
时,输出可能会保留在缓冲区中,直到:

  1. 缓冲区被刷新(手动或自动)
  2. 打印换行符
    \n
    System.out.println
  3. 程序终止。

这可能会导致程序在等待输入时出现暂停的情况。

您可以在

System.out.flush()
之前使用
scanner.nextInt();
以确保输出立即写入控制台。另一种选择是使用
System.out.println
而不是
System.out.print
示例:

System.out.println("Enter a number:");
int number = scanner.nextInt();
© www.soinside.com 2019 - 2024. All rights reserved.