You need to enable JavaScript to run this app. Java中BufferedReader的read()方法末尾返回-1的运行原理是什么?
优惠活动
大模型
产品
解决方案
定价
更多

Java中BufferedReader的read()方法末尾返回-1的运行原理是什么?

BufferedReader的read()方法相关问题解答

1. 读取结束时为何返回-1

这是Java字符输入流体系的统一约定:read()方法的返回值类型为int,正常读取到的字符会转为0~65535之间的无符号整数返回,对应char类型的取值范围。选择-1作为流结束标识,是因为-1不在有效字符的返回值区间内,不会和正常读取到的字符值产生冲突,可以明确标识流已经没有更多可读取的内容。
所有继承自Reader抽象类的字符输入流(包括FileReader、InputStreamReader、BufferedReader等)都遵守这个约定。

2. BufferedReader的read()具体工作机制

BufferedReader是带缓冲区的字符输入流,核心目的是通过减少磁盘IO次数提升读取效率,它的read()执行逻辑如下:

  • 内部默认维护了一个大小为8192的char类型缓冲区数组,调用read()时会优先检查缓冲区中是否还有未读取的剩余字符
  • 如果缓冲区存在未读字符,直接取出当前读指针指向的字符,转换为int类型返回,同时读指针后移一位
  • 如果缓冲区已经全部读完,会自动调用底层绑定的输入流(示例中为FileReader),一次性读取尽可能多的字符填充整个缓冲区,再返回第一个读取到的字符
  • 如果调用底层流填充缓冲区时,发现已经到了输入源(比如文件)的末尾,没有更多内容可以读取,就会返回-1

示例代码中while循环的逻辑说明

你给出的示例代码逻辑如下:

import java.io.*;  
public class BufferedReaderExample {  
    public static void main(String args[])throws Exception{    
          FileReader fr=new FileReader("D:\\testout.txt");    
          BufferedReader br=new BufferedReader(fr);    
  
          int i;    
          while((i=br.read())!=-1)    // 此处先执行read()把返回值赋值给i,再判断是否等于结束标识
          {  
          System.out.print((char)i);  
          }  
          br.close();    
          fr.close();    
    }    
}

每次循环都会先执行i=br.read()拿到读取结果:如果返回值不是-1,说明拿到了有效字符,强转为char后输出;如果返回值是-1,说明文件内容已经全部读完,直接终止循环。

内容的提问来源于stack exchange,提问作者Sushant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 04:21:01