资源关闭优化方案

2021-08-01 java后端开发技巧

传统的资源关闭方法,需要我们使用if加上try……cache语句,那么有没有更加优雅的资源关闭方法呢,使我们的代码看上去更精简,而不是一坨的摆在哪里。

# 传统的资源关闭写法

先来体验一下传统的资源关闭方式,注意 finally 类中的代码,其繁琐程度大家体验一下

@Test
public void copyFile() {
    // 定义输入路径和输出路径
    String originalUrl = "lib/FileCopyTest.java";
    String targetUrl = "targetTest/target.txt";

    // 声明文件输入流,文件输出流
    FileInputStream originalFileInputStream = null;
    FileOutputStream targetFileOutputStream = null;

    try {
        // 实例化文件流对象
        originalFileInputStream = new FileInputStream(originalUrl);
        targetFileOutputStream = new FileOutputStream(targetUrl);

        // 读取的字节信息
        int content;
        // 迭代,读取/写入字节
        while ((content = originalFileInputStream.read()) != -1) {
            targetFileOutputStream.write(content);
        }
    }  catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 关闭流资源
        if (targetFileOutputStream != null) {
            try {
                targetFileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (originalFileInputStream != null) {
            try {
                originalFileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

# TWR方式优化资源关闭

TWR 是简写,全称是 try-with-resource ,直接上代码体会一下

@Test
public void copyFile2() {
    // 先定义输入/输出路径
    String originalUrl = "lib/NewFileCopyTest.java";
    String targetUrl = "targetTest/new.txt";

    // 初始化输入/输出流对象
    try (
        FileInputStream originalFileInputStream = new FileInputStream(originalUrl);
        FileOutputStream targetFileOutputStream = new FileOutputStream(targetUrl);
    ) {
        int content;
        // 迭代,拷贝数据
        while ((content = originalFileInputStream.read()) != -1) {
            targetFileOutputStream.write(content);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

解析: 在 try() 中定义的资源不需要关闭,jdk 自动帮我们处理了

注意:这种写法 jdk7 才开始支持,不会有执行效率上的提升,是 jdk 的语法糖,简化开发代码的。

上次更新: 2 年前