与java中的缓冲读取器混淆 当我仅使用//1-start运行代码时,输出是输入字符的ascii值 当我仅使用//2-start运行代码时,输出是以换行符结尾的输入字符串 当我同时运行这两个代码时(如下面的代码所示),只执行//1-start,readLine()被认为是一种奇怪的方式 当我同时运行代码时(将//2-start置于//1-start之上),这两个代码都可以正常执行
请解释为什么这种奇怪的行为发生在案例3而不是案例4中与java中的缓冲读取器混淆 当我仅使用//1-start运行代码时,输出是输入字符的ascii值 当我仅使用//2-start运行代码时,输出是以换行符结尾的输入字符串 当我同时运行这两个代码时(如下面的代码所示),只执行//1-start,readLine()被认为是一种奇怪的方式 当我同时运行代码时(将//2-start置于//1-start之上),这两个代码都可以正常执行,java,Java,请解释为什么这种奇怪的行为发生在案例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 S
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();
}
}
}
int read()方法尝试从控制台(或文件)读取下一个字符,并返回其Unicode值
由于此方法在打印时必须返回Unicode值,因此我们应该执行类型转换
如果没有下一个字符,我们将得到-1
String readLine()方法尝试从控制台(或文件)读取下一行并返回它(如果可用)
如果下一行不可用,则返回null。您的
BufferedReader
将InputStreamReader
与System.in
一起使用。BufferedReader
使用InputStreamReader
中的read()
方法从标准输入流系统中读取数据。现在,让我们看看这个read()
方法的API
[…]此方法阻塞,直到输入数据可用、检测到流结束或引发异常为止
在这种情况下,阻塞意味着等待用户通过控制台输入数据,并用Enter键确认。
记住这一点,让我们来检查您的案例。
1.intb=br.read()代码>尚未键入任何内容,因此此方法将一直阻止,直到用户键入内容,然后打印第一个字符的ascci值。
2.字符串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();
要求用户输入,并用回车键确认。整行都会读出来
int b= br.read();
没有剩余的未使用数据,因为readLine()
已经读取了整行数据,包括\n
字符。所以这个read()
调用阻塞,用户被要求输入。你说的“readLine()正在以一种奇怪的方式被考虑”是什么意思?我猜,readLine返回一个空行。@Gaël readLine()在不等待任何输入的情况下中断,它读取一个空行,因为read不会从第一个输入中删除换行符。如果将实际输入和输出添加到问题中,则可能会更清楚。你有没有试过用超过一个字符长的输入来运行它?谢谢你的回答,但我认为@David的评论对我更有帮助