我在Java输入方面遇到了一些问题。 我的代码是一个猜谜信游戏。(我从一本书中读到它。) 这是我的代码。
public class Guess4 {
public static void main(String args[])
throws java.io.IOException{
char ch, ignore, answer = 'K';
do{
System.out.println("I'm thinking of a letter between A and Z.");
System.out.print("Can you guess it : ");
ch = (char) System.in.read();
do{
ignore = (char) System.in.read();
}while(ignore != '\n');
if(ch == answer) System.out.println("** Right **");
else{
System.out.print("...Sorry, you're ");
if(ch<answer) System.out.println("too low.");
else System.out.println("too high.");
System.out.println("Try again!\n");
}
}while(answer != ch);
}
我不明白为什么这段代码是必要的。
do{
ignore = (char) System.in.read();
}while(ignore != '\n');
删除此块时。输出结果不同。
这本书确实说过缓冲线,但我仍然不明白。 任何人都可以解释缓冲线是什么吗?
谢谢。
答案 0 :(得分:2)
该程序要求用户输入一个字母。但是System.in是缓冲的。用户实际上可以键入多个字符。即使是长句。直到最后他按下了输入,即字符'\ n'。
程序将字符读入ch:
ch = (char) System.in.read();
然后它会更进一步,并继续阅读,直到找到'\ n'字符:
do {
ignore = (char) System.in.read();
} while (ignore != '\n');
如果不执行此步骤,则用户输入的任何额外输入将继续用于外循环的下一次迭代。你不希望任何结转,只想输入第一个字符,丢弃其余的字符,这样在下一次迭代中你就可以用干净的缓冲区开始。
使用带有ignore注释掉的循环尝试代码。如果输入单个字母,外部循环将运行两次,对于您输入的字母和结束输入的“\ n”字符。如果你输入多个字母,让我们说“你好”,循环将运行6次,字母h-e-l-l-o运行5次,结束输入的'\ n'字符再运行一次。
- &GT;需要忽略的循环才能清除输入缓冲区。
答案 1 :(得分:0)
当您通过控制台输入文本时,只有当您按下&#34;输入&#34;时才会将输入发送到程序。或&#34;返回&#34;。然后程序将获得整行(包括标记行尾的换行符\n
),而不仅仅是您感兴趣的一个字符。
while循环处理这些额外的字符并将它们抛弃。
答案 2 :(得分:0)
它是下一行字符,来自按Enter键。
如果您要输入一封信(让我们说A
)并按回车键,则您从System.in
获得的字符将为A\n
(2个字符)。
然后从输入缓冲区中删除\n
,这样就不会搞乱程序的逻辑。
你可能正在阅读一本旧书,因为新书倾向于使用Scanner
类,这比从System.in
读取更简单。您可能想要考虑其他一些阅读材料,因为阅读过时的书可能会产生一些有趣的想法。
答案 3 :(得分:0)
根据代码判断,我认为以下代码的输入类似于:
A
J
K
因此,在第三次尝试时,它将打印成功。
但是如果你看一下输入流(系统代表它),它看起来像是:A\nJ\nK\n
。现在你的代码通过输入流找到一个有效的输入并读取第一个之后的所有字符,直到\n
字符为垃圾,即忽略它。
因此,如果输入流类似于AK\nKA\n
,它将在第二次尝试时打印成功,而不是在第一次尝试时打印成功,因为它忽略了输入1个字符后的所有字符,即A
为第一个和{{ 1}}为第二行。
如果您删除了您提到的阻止,那么您的代码会读取输入流中包含K
的所有字符,这些字符显然与\n
不匹配。
缓冲输入流处理输入,删除任何额外的垃圾字符,以便您只读取输入。例如:
K
这将BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
流传递给Reader对象,BufferedReader完成所有魔术。一旦你深入了解,这些课程还有很多。