这个问题在这里已有答案:
我在这里找到的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根本无法做到这一点。输入的所有字符都将被缓冲,直到您按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;
}
}