394. Java 文件操作基础 - 资源释放与异常处理
在使用 Java I/O API 时,资源的释放和异常的处理是两个必须关注的重点。
如果忘记关闭资源(如文件流、网络连接、通道等),会导致:
- 内存泄漏(Memory Leak)
- 文件句柄耗尽(File Handle Exhaustion)
- 应用性能下降甚至崩溃 🚨
🔑 1. 资源释放的基本要求
许多 I/O 相关的类(如 InputStream、Reader、Channel)都实现了 java.io.Closeable 接口。
它们的共同点是:必须在使用完毕后调用 close() 方法,释放底层系统资源。
👉 如果不调用 close(),你的程序可能暂时看不出问题,但在长时间运行或高并发场景下会严重出问题。
🔑 2. 异常处理
所有的 I/O 操作都会抛出 IOException,这是 Java I/O 的“通用异常”。
此外,还有一些更具体的异常,例如:
FileNotFoundException:当你要读取的文件不存在时抛出EOFException:当文件读到末尾时可能抛出
所以在写 I/O 代码时必须通过 try-catch 来处理。
✅ 示例 :多个资源
有时会嵌套使用多个 I/O 类(如 FileReader + BufferedReader),此时也可以写在一个 try 中,系统会按照 声明的逆序 自动关闭。
File file = new File("file.txt");
try (FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("处理文件时出错:" + e.getMessage());
}
📌 解释:
- 当
try结束时,会 先关闭bufferedReader,再关闭fileReader。 - 这样就保证了资源的正确释放顺序。
🔑 5. 使用场景举例
- 文本编辑器:读取和保存文件内容时,必须关闭 Reader/Writer。
- 日志系统:写日志文件时,如果不关闭 Writer,日志可能丢失。
- 网络应用:Socket 连接也是
Closeable,必须关闭,否则会造成端口占用。
🎯 总结
- 必须关闭 I/O 资源,否则会有性能和稳定性问题。
- 异常要捕获处理,尤其是
IOException和子类异常。 - 推荐使用
try-with-resources(Java 7+),更简洁、安全、可维护。 - 多个资源时,系统会自动按照逆序关闭。