Java中BufferedReader示例详解
简介
在Java编程中,BufferedReader
是一个非常实用的类,它位于 java.io
包中。BufferedReader
提供了高效的字符输入流读取功能,通过缓冲区减少了与底层数据源(如文件、网络连接等)的交互次数,从而提高了读取性能。本文将详细介绍 BufferedReader
的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用它。
目录
- 基础概念
- 使用方法
- 常见实践
- 最佳实践
- 小结
- 参考资料
基础概念
BufferedReader
是一个字符缓冲输入流类,它继承自 Reader
类。其主要作用是从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
BufferedReader
内部维护了一个缓冲区,当调用 read()
或 readLine()
方法时,它首先尝试从缓冲区中读取数据。如果缓冲区为空,它会从底层输入流中读取一大块数据填充到缓冲区,然后再从缓冲区中取出数据返回给调用者。这样可以减少与底层输入流的交互次数,提高读取效率。
使用方法
1. 创建 BufferedReader
对象
通常需要先创建一个底层的字符输入流,如 FileReader
或 InputStreamReader
,然后将其作为参数传递给 BufferedReader
的构造函数。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try {
// 创建 FileReader 对象
FileReader fileReader = new FileReader("example.txt");
// 创建 BufferedReader 对象
BufferedReader bufferedReader = new BufferedReader(fileReader);
// 使用完后关闭资源
bufferedReader.close();
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 读取数据
BufferedReader
提供了两个常用的读取方法:
- read()
:读取单个字符,返回字符的 Unicode 码值,如果到达流的末尾则返回 -1。
- readLine()
:读取一行文本,返回包含该行内容的字符串,如果到达流的末尾则返回 null
。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderReadExample {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
// 使用 read() 方法读取单个字符
int c;
while ((c = bufferedReader.read()) != -1) {
System.out.print((char) c);
}
// 或者使用 readLine() 方法读取一行文本
/*
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
*/
bufferedReader.close();
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
常见实践
1. 从控制台读取用户输入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderConsoleInputExample {
public static void main(String[] args) {
try {
// 创建 InputStreamReader 对象,将 System.in 转换为字符流
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
// 创建 BufferedReader 对象
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println("请输入一行文本:");
String line = bufferedReader.readLine();
System.out.println("你输入的文本是:" + line);
bufferedReader.close();
inputStreamReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 逐行读取文件内容并统计行数
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderCountLinesExample {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
int lineCount = 0;
String line;
while ((line = bufferedReader.readLine()) != null) {
lineCount++;
}
System.out.println("文件的行数为:" + lineCount);
bufferedReader.close();
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
最佳实践
1. 使用 try-with-resources
语句
try-with-resources
语句可以自动关闭实现了 AutoCloseable
接口的资源,避免手动关闭资源时可能出现的错误。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderTryWithResourcesExample {
public static void main(String[] args) {
try (FileReader fileReader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 合理设置缓冲区大小
BufferedReader
的构造函数允许指定缓冲区的大小。一般情况下,使用默认的缓冲区大小即可,但在某些情况下,根据实际需求调整缓冲区大小可以进一步提高性能。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderCustomBufferSizeExample {
public static void main(String[] args) {
try (FileReader fileReader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader, 8192)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
小结
BufferedReader
是 Java 中一个非常实用的字符缓冲输入流类,它通过缓冲区提高了字符读取的效率。本文介绍了 BufferedReader
的基础概念、使用方法、常见实践以及最佳实践。在实际开发中,我们可以根据具体需求选择合适的读取方法,并结合 try-with-resources
语句和合理设置缓冲区大小来提高代码的健壮性和性能。
参考资料
- 《Effective Java》
- 《Java核心技术》