讲述java资源关闭 -莫问身后事

垃圾回收(GC)的特别说明

  1. 垃圾回收机制只负责回收堆内存资源,不会回收任何物理资源
  2. 程序无法精确控制垃圾回收动作的具体发生时间
  3. 在垃圾回收之前,总会先调用它的finalize方法

常见的需要手动释放的物理资源

  1. 文件/流资源
  2. 套接字资源
  3. 数据库连接资源

物理资源不手动释放有哪些问题

  1. 资源被长时间无效占用
  2. 超过最大限制后,将无资源可用
  3. 导致系统无法正常运行

流的组成

在这里插入图片描述

jdk7之前和jdk7之后的文件拷贝功能案例说明

jdk7之前案例

import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * JDK7之前的文件拷贝功能
 */

public class FileCopyTest {
    @Test
    public void copyFile() {
        /**
         * 1. 创建输入/输出流
         * 2. 执行文件拷贝,读取文件内容,写入到另一个文件中
         * 3. **关闭文件流资源**
         */

        // 定义输入路径和输出路径
        String originalUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\lib\\FileCopyTest.java";
        String targetUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\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 (FileNotFoundException e) {
            e.printStackTrace();
        } 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();
                }
            }
        }

    }
}


jdk7之后案例

/**
 * 基于JDK7之后,实现正确关闭流资源方法
 * try - with - resource
 */
public class NewFileCopyTest {

    @Test
    public void copyFile() {

        // 先定义输入/输出路径
        String originalUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\lib\\FileCopyTest.java";
        String targetUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\targetTest\\target.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();
        }

    }

}


jdk7之后的try-with-resource使用

是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。

  1. 多资源自动关闭
  2. 实现AutoCloseable接口
  3. 避免异常屏蔽

资源关闭顺序问题

  1. 先开后关原则
  2. 从外到内的原则
  3. 底层资源单独声明原则

资源关闭特殊情况

  1. 资源对象被return的情况下,由调用方关闭
  2. bytearrayinputstream等不需要检查关闭的资源对象
  3. 使用scoket获取的IputStream和OutputStream对象不需要关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值