您的位置:

Java中如何使用try-with-resources自动关闭文件和流

在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子句来释放资源。