394. Java 文件操作基础 - 资源释放与异常处理

22 阅读2分钟

394. Java 文件操作基础 - 资源释放与异常处理

在使用 Java I/O API 时,资源的释放异常的处理是两个必须关注的重点。

如果忘记关闭资源(如文件流、网络连接、通道等),会导致:

  • 内存泄漏(Memory Leak)
  • 文件句柄耗尽(File Handle Exhaustion)
  • 应用性能下降甚至崩溃 🚨

🔑 1. 资源释放的基本要求

许多 I/O 相关的类(如 InputStreamReaderChannel)都实现了 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+),更简洁、安全、可维护。
  • 多个资源时,系统会自动按照逆序关闭。