我正在研究一个Java A初学者指南(第9版)一书中提供的一个示 routine 序,该书由赫伯特·斯柴尔特 compose .该示例为:
下面的程序通过读取字符来演示
read()
控制台,直到用户键入句点.
代码如下所示:
import java.io.*;
public class ReadChars {
public static void main(String[] args) throws IOException{
char c;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, System.console().charset()));
System.out.println("Enter characters, period to quit.");
do {
c = (char) br.read();
System.out.println(c);
} while (c != '.');
}
}
它们提供的示例输出如下所示:
Enter characters, period to quit.
One Two.
O
n
e
T
w
o
.
在我看来,输入(如上所述)终止于'.'
个字符,然后打印到控制台.
但是,当我自己运行该示例时,输出看起来更像这样:
Enter characters, period to quit.
abcde.fghij<return>
a
b
c
d
e
.
也就是说,我首先必须以<return>
结束输入,然后才能正确打印字符,直到输入中的第一个'.'
个字符.
我想了解这里到底发生了什么.我认为这与控制台输入以某种方式缓冲并仅在<return>
上刷新有关,但对我来说,考虑到代码的 struct ,这有点令人困惑,它读取并打印do-While循环中的字符,应该在遇到'.'
时立即中断.
与示例输出(即上面的第一个输出)形成对比的是,是否有人能够分解导致此行为(即上面的最后一个输出)的发生的事情的顺序?