为什么按任意键方法不会循环停止?

Why the press any key method does not stop in a loop?

我在java这里找到了这个方法。

private void pressAnyKeyToContinue() {
     try {
         System.in.read();
     }  
        catch(Exception e) {}  
 }

我遇到的问题是当我想多次调用它时。我在打印如下消息的方法中使用它:

private void keyMessage() {
    System.out.print("Press any key to continue...");
    pressAnyKeyToContinue();

然后我在这里使用这个方法:

public void method() {
    message1();
    for (Class class : classes) {
        keyMessage();
    }   
}

我遇到的问题是当我首先调用 method() 时它会打印出来。

Otuput: Press any key to continue...

然后我按一个键+回车。直到这里一切都完美,然后它打印:

Output: Press any key to continue... //* times of the loop

我的意思是它不让我按任何键。它只是一直持续到循环结束。

感谢您的回答,抱歉我的英语不好。我知道这样不好。

标准控制台java根本无法做到这一点。所有输入的字符都会被缓冲,直到您按下回车键,此时它们都可用在 System.in.

所以,如果你循环你的 'press any key' 代码,比如 5 次,然后我输入句子 'hello!',你的代码仍然停留在第一个,等待按键。如果我然后按回车键,所有 5 个循环立即完成,如果你稍后调用 waitForKey,它会立即 return 再 2 到 3 次(一次用于感叹号,一次用于换行符......两次)如果在 windows 上,因为他们的换行符是 2 个字符)。

TL;DR:您不能为此使用 System.in.read()。完全没有。

一种解决方案是要求用户不要按'any'键,而是按'enter'键,然后在设置分隔符后使用例如扫描仪的next()调用到换行符,或者编写不断调用 System.in.read() 直到 returns '\n':

的代码
private void pressEnterToContinue() {
    while (true) {
        int c;
        try {
            c = System.in.read();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (c == -1 || c == '\n') return;
    }
}