我是java的新手,我的问题是按下一个键后输出显示2个数字,我无法理解为什么。
这是代码:
class ForTest {
public static void main(String args[]) throws java.io.IOException {
int i;
System.out.println("Press S to stop.");
for(i = 0; (char) System.in.read() != 'S'; i++)
System.out.println("Pass #" + i);
}
}
答案 0 :(得分:1)
我觉得你的问题是缓冲的I / O.我假设你的“按键”之间你正在进入?在大多数系统上,I / O在输入收到换行符之前不会刷新。这个问题是缓冲区中有一个换行符,它会计入循环中的字符数。
编辑:
如果情况确实如此,您似乎希望在您点击仅包含“S”的行之前,您的“通行证”是行数。如果是这样,请尝试使用以下内容:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class ForTest {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i;
System.out.println("Press S to stop.");
for(i = 0; !br.readLine().equals("S"); i++)
System.out.println("Pass #" + i);
}
}
答案 1 :(得分:1)
虽然我无法重现问题:(See Here),我的建议是打印出字符(作为整数)。这将有助于您调试:
for(i = 0; (char)( int c = System.in.read() ) != 'S'; i++)
System.out.println("Pass #" + i + ": " + c);
答案 2 :(得分:1)
我测试了你的程序,我想我看到了问题,如果仔细观察,你会发现,当你按下两次按键时,你有3个输出,当你按下三次按键时,你有4个输出等。
问题是System.in.read()
确实将换行计为一个字符,因此您总会有一个输出。
答案 3 :(得分:1)
请参阅输入流中的read方法说明。在内部,它可以进行2次通话。如果第一次调用导致IOException,它将再次进行另一次调用,如果返回IOException ..那么它将被视为文件结束。
http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html