2021-12-16 17:49:37
在Java中,使用try-with-resources语句可以高效管理IO流资源,其核心机制是通过自动调用实现了AutoCloseable接口的资源的close()方法,确保资源在代码块执行完毕后(无论是否发生异常)都能被正确释放。以下是具体用法和关键点说明:
1. 基本语法与核心优势自动释放:JVM在代码块结束后自动关闭资源,避免手动调用close()的遗漏或异常导致的泄漏。
异常安全:即使代码块中发生异常,资源仍会被关闭。
以BufferedReader读取文件为例:
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); }} catch (IOException e) { System.err.println("读取文件时出错:" + e.getMessage());}FileReader和BufferedReader均实现了AutoCloseable接口,因此会被自动关闭。
无需显式调用br.close(),代码更简洁。
在同一个try语句中管理多个资源,用分号分隔声明:
try ( FileInputStream fis = new FileInputStream("input.txt"); FileOutputStream fos = new FileOutputStream("output.txt")) { int data; while ((data = fis.read()) != -1) { fos.write(data); }} catch (IOException e) { System.err.println("复制文件失败:" + e.getMessage());}若需管理自定义资源类,只需实现AutoCloseable接口并重写close()方法:
public class MyResource implements AutoCloseable { public void doWork() { System.out.println("正在工作..."); } @Override public void close() { System.out.println("资源已关闭"); }}自定义类的close()方法会在try块结束后自动调用。
适用于需要特殊资源清理的场景(如数据库连接、网络套接字等)。
若try块和close()方法均抛出异常,close()的异常会被抑制(可通过Throwable.getSuppressed()获取)。
建议在catch块中处理可能的异常。
代码更简洁,减少样板代码。
避免因finally块中异常导致的资源未关闭问题。