请解释为什么这种奇怪的行为发生在案例3中,但不是案例4。
public class InputBufferedReader {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
//1-start
//read one character
System.out.println("enter input: ");
int b= br.read();
System.out.println(b);
//end
//2-start
//read a string
System.out.println("enter input string: ");
String a = br.readLine();
System.out.println(a);
//end
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:5)
您的BufferedReader
将InputStreamReader
与System.in
一起使用。 BufferedReader
使用read()
中的InputStreamReader
方法从标准输入流System.in
中读取数据。现在让我们来看看这个read()
方法的API。
[...]此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。
此上下文中的阻止装置等待用户通过控制台使用Enter键确认输入数据
考虑到这一点,让我们检查你的案例
1。 int b= br.read();
没有输入任何内容,因此此方法会阻止,直到用户输入内容然后打印第一个字符的ascci值。
2。 String a = br.readLine();
没有输入任何内容,因此此方法会阻止,直到用户输入内容然后打印整行。
3。
int b= br.read();
让图片用户键入a
,使用Enter键确认输入为a\n
。现在read()
读取第一个字符a
。
String a = br.readLine();
此read()
调用不会阻止并请求用户输入,因为还有未使用的输入\n
。因此readLine()
会读\n
的 4 强>
String a = br.readLine();
要求用户输入通过Enter键确认的输入。整行将被阅读。
int b= br.read();
没有剩余未使用的数据,因为readLine()
已经读取了整行,包括\n
个字符。因此,要求输入read()
呼叫块和用户。
答案 1 :(得分:1)
int read()方法尝试从控制台(或文件)读取下一个字符并返回其 Unicode值,
由于此方法在打印时必须返回Unicode值,我们应该执行类型转换。
如果没有下一个字符,我们将获得 -1 。
字符串readLine()方法尝试从控制台(或文件)读取下一行并返回它(如果可用)。
如果Next行不可用,则返回null。