在 Java 中,BufferedReader 是一个字符缓冲输入流类,主要用于高效地读取字符数据,属于 java.io 包下的核心类之一。它的设计目的是通过缓冲机制减少 IO 操作次数,从而提高读取文本文件或其他字符输入流的效率。
核心作用:
-
高效读取字符数据
BufferedReader内部维护了一个字符缓冲区(默认大小为 8192 字符),会一次性从底层输入流(如文件、网络流)读取一批数据到缓冲区,后续读取操作直接从缓冲区获取,避免了频繁调用底层 IO 方法(减少磁盘或网络访问次数),大幅提升读取性能。 -
提供便捷的读取方法
相比基础的字符输入流(如FileReader),BufferedReader增加了更易用的方法,最常用的是:readLine():一次读取一整行文本(以换行符\n或\r\n为结束标志),返回字符串(不包含换行符),到达流末尾时返回null。read():读取单个字符,返回字符的 ASCII 码(int 类型),到达末尾返回-1。
常见使用场景:
- 读取文本文件(如
.txt、.csv等)。 - 读取控制台输入(通过包装
InputStreamReader实现)。 - 读取网络传输的字符数据(如 Socket 通信的输入流)。
使用示例:
1. 读取文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
// 声明BufferedReader变量
BufferedReader br = null;
try {
// 创建BufferedReader对象,包装底层的FileReader(文件输入流)
br = new BufferedReader(new FileReader("example.txt"));
String line;
// 循环读取每一行,直到readLine()返回null(文件结束)
while ((line = br.readLine()) != null) {
System.out.println(line); // 打印读取到的行
}
} catch (IOException e) {
e.printStackTrace(); // 处理IO异常
} finally {
// 关闭流(必须在finally中确保关闭,释放资源)
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2. 读取控制台输入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadConsoleExample {
public static void main(String[] args) {
// 包装系统输入流(System.in),用于读取控制台输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入内容:");
String input = br.readLine(); // 读取用户输入的一行文本
System.out.println("你输入的是:" + input);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意事项:
-
必须关闭流:
BufferedReader属于资源类,使用后必须调用close()方法关闭,否则会导致资源泄露。推荐使用 try-with-resources 语法(Java 7+)自动关闭流,简化代码:// try-with-resources:自动关闭实现了AutoCloseable接口的资源 try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } -
字符流特性:
BufferedReader是字符流,主要处理文本数据(按字符编码读取),不适合读取二进制文件(如图片、视频等,应使用字节流BufferedInputStream)。 -
编码问题:默认使用系统默认字符编码,如需指定编码(如 UTF-8),可通过
InputStreamReader包装时设置:new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"))
总结:BufferedReader 是处理字符输入的高效工具类,通过缓冲机制和便捷方法(尤其是 readLine()),让文本读取变得简单高效,是 Java 中读取文本数据的首选类之一。
备注:
零、
System.in 是字节流,InputStreamReader 将其转为字符流
txt 文件是字节存储(任何文件都是字节存储),FileReader 将其转为字符流
一、FileReader 是什么?
FileReader 是 Java 中用于读取字符文件的输入流类(属于 java.io 包),它继承自 InputStreamReader,专门用于从文件中读取字符数据(按字符编码解析字节)。
它的核心作用是:
- 连接文件系统,将文件中的字节数据按照默认字符编码(或指定编码)转换为字符。
- 作为 “底层流” 提供基础的字符读取能力,但读取效率较低(因为每次读取可能直接操作磁盘)。
通常不会单独使用 FileReader,而是配合 BufferedReader 这样的缓冲流使用,以提高效率(就像之前示例中 new BufferedReader(new FileReader("file.txt")) 的用法)。
System.in 是字节流,InputStreamReader 将其转为字符流
txt 文件是字节存储,FileReader 将其转为字符流
二、如果送入 BufferedReader 的字符大小超过其缓冲区最大值会怎样?
首先明确:BufferedReader 的缓冲区是 **“临时存储区域”**,用于减少对底层流(如 FileReader)的访问次数,它的缓冲区大小(默认 8192 字符)并不限制 “能读取的字符总量”。
当读取的数据量超过缓冲区大小时,流程是这样的:
BufferedReader会先填满缓冲区(读取 8192 字符),供程序读取;- 当程序读取完缓冲区的内容后,
BufferedReader会自动从底层流(FileReader)读取下一批数据,再次填满缓冲区; - 重复上述过程,直到所有数据读取完毕。
简单说:缓冲区大小只是 “一次读取的批量大小”,不限制总读取量,无论文件有多大(只要内存足够),BufferedReader 都会分批次读取,不会因为总数据量超过缓冲区大小而报错。
1万+

被折叠的 条评论
为什么被折叠?



