在Java中,文件I/O和流处理非常常见。在读取和写入文件时,需要打开文件和流。但是,如果在程序结束时忘记关闭文件或流,将会导致内存泄漏和资源浪费。所以我们需要手动关闭它们。使用try-with-resources语句,就可以简化这个过程,自动关闭文件和流。
一、try-with-resources语句的使用
try-with-resources语句可以自动关闭在程序中使用的任何资源,例如文件,流等。在这个语句中,你只需要把你要打开和使用的资源放到try-with-resources语句中即可。在执行完try块的代码后,资源会自动关闭。
try (resource) { //try block code } catch (Exception ex) { //exception handling code }
在上面的代码中,我们把资源放在try语句括号内。当try块的代码执行完成后,资源会被自动关闭。
二、try-with-resources语句与Java7之前的比较
在Java 7之前,我们需要手动关闭文件和流。这是一个非常繁琐和容易出错的过程。以下是一个传统的文件读取方式:
BufferedReader br = null; try { br = new BufferedReader(new FileReader("file.txt")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
很显然,这段代码非常冗长并且容易出错。但是,如果我们使用try-with-resources语句,我们可以把这个烦人的关闭代码省略掉:
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
在这个代码段中,BufferedReader对象被用作try-with-resources语句的参数。我们不需要手动关闭它。
三、多个资源的情况
很多时候我们需要同时使用多个资源,比如同时读取多个文件。在这种情况下,我们可以在try-with-resources语句中使用多个资源。
try ( BufferedReader br1 = new BufferedReader(new FileReader("file1.txt")); BufferedReader br2 = new BufferedReader(new FileReader("file2.txt")) ) { String line1 = br1.readLine(); String line2 = br2.readLine(); while (line1 != null || line2 != null) { if (line1 != null) { System.out.println(line1); line1 = br1.readLine(); } if (line2 != null) { System.out.println(line2); line2 = br2.readLine(); } } } catch (IOException e) { e.printStackTrace(); }
在这个代码段中,我们使用了两个BufferedReader对象。我们把它们都放在try-with-resources语句括号内。
四、自定义资源的情况
有时我们需要使用自定义资源,比如自己写的类。在这种情况下,我们必须确保我们的类实现了java.lang.AutoCloseable接口,并重写了close方法。这个接口在包含一个单独的方法:close()。close()方法会被自动调用,从而关闭资源。
public class MyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("MyResource closed"); } } public class Main { public static void main(String[] args) { try (MyResource myResource = new MyResource()) { //use myResource } catch (Exception e) { e.printStackTrace(); } } }
在这个代码段中,我们创建了一个MyResource类,并实现了AutoCloseable接口。我们重写了close()方法。在try-with-resources语句中使用MyResource对象时,它会在try块执行完成后自动关闭。
五、总结
在Java中,try-with-resources语句让资源管理更加容易。无论是文件,流,数据库连接,Socket,还是任何实现了java.lang.AutoCloseable接口的自定义资源,都可以在try-with-resources语句中使用,并得到自动关闭。
当使用try-with-resources语句时,程序员不必担心创建任何finally子句来释放资源。