与java中的缓冲读取器混淆 当我仅使用//1-start运行代码时,输出是输入字符的ascii值 当我仅使用//2-start运行代码时,输出是以换行符结尾的输入字符串 当我同时运行这两个代码时(如下面的代码所示),只执行//1-start,readLine()被认为是一种奇怪的方式 当我同时运行代码时(将//2-start置于//1-start之上),这两个代码都可以正常执行

与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

请解释为什么这种奇怪的行为发生在案例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();
    }
  }
}
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的评论对我更有帮助