核心实现方式
传统IO流组合(FileReader + BufferedReader)
这是最基础且高效的逐行读取方案,适合处理大文件或需要精确控制内存的场景,关键步骤如下:
- 创建文件对象:通过
new File("路径")定位目标文件; - 封装缓冲读取器:用
BufferedReader包裹FileReader以提升性能; - 循环读取行数据:利用
readLine()方法逐行获取内容,直至返回null表示结束。import java.io.; public class BasicReadExample { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); // 处理每一行的逻辑 } } catch (IOException e) { e.printStackTrace(); } } }优势:低内存占用、兼容旧版JDK;
️ 注意:需手动关闭资源(推荐使用try-with-resources语法自动管理)。
NIO一次性加载(Files.readAllLines())
Java 8引入的简洁方案,直接将全部内容存入List<String>,适用于小型文本文件。
import java.nio.file.;
import java.util.List;
public class NioReadExample {
public static void main(String[] args) throws Exception {
List<String> lines = Files.readAllLines(Paths.get("data.txt"));
lines.forEach(System.out::println); // 遍历打印所有行
}
}
️ 特点:代码量少但会一次性加载整个文件到内存,慎用于超大文件!
Apache Commons IO工具库
若项目允许第三方依赖,可借助FileUtils实现一行代码完成读写:
import org.apache.commons.io.FileUtils;
import java.util.List;
public class CommonsIoExample {
public static void main(String[] args) throws Exception {
List<String> content = FileUtils.readLines(new File("data.txt"), "UTF-8");
content.forEach(System.out::println);
}
}
适用场景:快速开发时优先选择,但需添加Maven坐标commons-io:commons-io:1.4。
写入TXT文件的实践
与读取相对应,写出操作同样分为多种模式:
| 方法 | 示例代码 | 适用场景 |
|———————–|————————————————————————–|————————|
| FileWriter基础写入 | new FileWriter("output.txt").write("Hello World"); | 单次覆盖式写入 |
| BufferedWriter优化版| 结合缓冲区批量提交数据,减少磁盘I/O次数 | 高频次小批量写入 |
| PrintWriter格式化输出| 支持类似控制台打印的便捷语法,如pw.println(formattedString) | 混合文本与变量的场景 |
典型示例——带缓冲区的追加模式写入:
try (BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt", true))) {
bw.write("New entry at " + new Date());
bw.newLine(); // 自动添加换行符
} catch (IOException e) { /异常处理/ }
技巧:构造函数第二个参数设为true可开启追加模式而非覆盖原有内容。
异常处理最佳实践
所有IO操作均可能抛出IOException及其子类,建议遵循以下原则:
- 分层捕获异常:区分“文件不存在”“权限不足”等具体错误类型;
- 资源自动释放:始终使用try-with-resources结构确保流被正确关闭;
- 编码规范:指定字符集(如UTF-8)避免乱码问题,特别是在跨平台环境中。
示例防御性编程:
File file = new File("config.txt");
if (!file.exists()) {
System.err.println("目标文件不存在!");
return;
}
try (FileReader fr = new FileReader(file, StandardCharsets.UTF_8)) { /.../ }
catch (UnsupportedEncodingException e) { /降级处理方案/ }
性能对比与选型建议
| 指标 | FileReader+BufferedReader | Files.readAllLines() | Apache Commons IO |
|---|---|---|---|
| 内存效率 | ⭐⭐⭐⭐⭐(逐行加载) | ⭐(全量载入内存) | ⭐⭐⭐(内部优化缓冲区) |
| 开发效率 | 中等 | 高 | 极高 |
| 功能扩展性 | 支持复杂逻辑干预 | 仅限简单读取 | 丰富工具类支持 |
| 推荐用途 | 大文件/流式处理 | 小文件快速解析 | 企业级项目通用方案 |
相关问答FAQs
Q1: 遇到乱码怎么办?
解决方案:显式指定编码格式,
- 读取时:
new FileReader("file.txt", StandardCharsets.UTF_8) - 写入时:
new FileWriter("file.txt", StandardCharsets.GBK)
避免依赖系统默认编码导致跨平台不一致问题。
Q2: 如何判断文件是否成功打开?
可通过元数据校验:
File file = new File("test.txt");
if (file.canRead()) {
System.out.println("可读权限正常");
} else {
System.err.println("无读取权限!");
}
结合exists()和`isFile
