Java BufferedReader
什么是 BufferedReader?
BufferedReader 是 Java IO 包中的一个重要类,它为字符输入流添加了缓冲功能,显著提高了读取操作的效率。当我们需要从文件或其他输入源读取文本数据时,BufferedReader 是一个理想的选择。
BufferedReader 通过减少对底层系统的调用次数来提高效率,它在内部维护一个字符缓冲区,一次性读取多个字符,而不是每次请求都进行系统调用。
BufferedReader 的基本特性
- 提供了高效的字符读取功能
- 支持按行读取文本
- 内部维护缓冲区以减少 I/O 操作
- 可以包装任何 Reader 对象以增强其性能
- 支持标记和重置操作
BufferedReader 的创建
要使用 BufferedReader,我们首先需要创建一个实例。 通常,我们会将其他 Reader 对象包装在 BufferedReader 中,如下所示:
// 从文件创建 BufferedReader
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
// 从字符串创建 BufferedReader
String data = "Hello, BufferedReader!";
BufferedReader stringReader = new BufferedReader(new StringReader(data));
// 从控制台输入创建 BufferedReader
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 的核心方法
读取单个字符
public int read() throws IOException
此方法从输入流中读取单个字符,并返回其 ASCII 值。如果到达流的末尾,则返回 -1。
BufferedReader reader = new BufferedReader(new StringReader("ABC"));
int character;
while ((character = reader.read()) != -1) {
System.out.println("读取的字符: " + (char)character);
}
reader.close();
输出结果:
读取的字符: A
读取的字符: B
读取的字符: C
读取字符数组
public int read(char[] cbuf, int off, int len) throws IOException
此方法将字符读入数组的指定部分。参数 cbuf
是目标数组,off
是数组中开始存储字符的偏移量,len
是要读取的最大字符数。
BufferedReader reader = new BufferedReader(new StringReader("Java BufferedReader Example"));
char[] buffer = new char[10];
int charsRead = reader.read(buffer, 0, 10);
System.out.println("读取的字符数: " + charsRead);
System.out.println("读取的内容: " + new String(buffer));
reader.close();
输出结果:
读取的字符数: 10
读取的内容: Java Buffe
按行读取文本
public String readLine() throws IOException
此方法读取一行文本。读取到行结束符(\n
、\r
或 \r\n
)时,结束读取,并返回该行文本(不包括行结束符)。如果到达流的末尾,则返回 null
。
BufferedReader reader = new BufferedReader(new StringReader("第一行\n第二行\n第三行"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("读取的行: " + line);
}
reader.close();
输出结果:
读取的行: 第一行
读取的行: 第二行
读取的行: 第三行
跳过字符
public long skip(long n) throws IOException
此方法跳过输入流中的 n
个字符,并返回实际跳过的字符数。
BufferedReader reader = new BufferedReader(new StringReader("ABCDEFGHIJ"));
reader.skip(3); // 跳过前3个字符
int character = reader.read();
System.out.println("跳过3个字符后读取的字符: " + (char)character);
reader.close();
输出结果:
跳过3个字符后读取的字符: D
关闭流
public void close() throws IOException
此方法关闭输入流并释放与之关联的系统资源。
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("example.txt"));
// 执行读取操作
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 try-with-resources 简化资源管理
在 Java 7 及更高版本中,我们可以使用 try-with-resources 语句自动管理资源,确保资源在使用后被正确关闭:
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
使用 BufferedReader 时,始终记得关闭它,以释放系统资源。最好使用 try-with-resources 语句,让 Java 自动处理资源的关闭。
缓冲区大小
BufferedReader 的构造函数允许我们指定缓冲区大小:
public BufferedReader(Reader in, int sz)
其中 in
是要包装的 Reader 对象,sz
是缓冲区的大小(以字符为单位)。如果不指定缓冲区大小,默认为 8192 字符。
// 创建一个具有自定义缓冲区大小的 BufferedReader
BufferedReader reader = new BufferedReader(new FileReader("example.txt"), 16384);