为什么按任何键方法不会在循环中停止? [重复]

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

我在这里找到的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();
    }   
}

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

Otuput: Press any key to continue...

然后我按一个键+输入。直到这里所有完美,但它打印:

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

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

感谢您的回答,对不起我的英语。我知道这不好。

java key continue any
1个回答
0
投票

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

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

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

一种解决方案是要求用户不要按“任何”键,而是按下“输入”键,然后在将分隔符设置为换行符之后使用例如扫描仪的next()调用,或者编写一直调用System.in.read()的代码直到它返回'\ 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.