Java——IO流(一)-(8/8):释放资源-try-catch-finally、try-catch-resource

目录

try-catch-finally

介绍

实例演示1

实例演示2

try-catch-resource

介绍

实例演示


try-catch-finally

介绍

普通的释放流的方法可能会因中间的异常或是其他原因,导致程序执行不到释放流的代码就结束了,会有资源浪费的风险,所以建议使用另外的资源释放方式来避免这种资源浪费。

try{

        ...

        ...

}catch (IOException e){

        e.printStack();

}finally{

        ...

}

  • finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止
  • 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。

实例演示1

public class Test1 {
    public static void main(String[] args) {
        try {
            System.out.println((10 / 2));
//        return;                   //跳出方法的执行————依旧会执行finally区的代码
//        System.exit(0);     //终止虚拟机————不会执行finally区的代码
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("===finally执行了一次===");
        }

    }
    public static int chu(int a,int b){
        try {
            return a/b;
        } catch (ArithmeticException e) {
            e.printStackTrace();
            return -1;  //代表程序出现异常
        } finally {
            //千万不要在finally中返回数据!
//            return 111;
            
        }
    }
}

运行结果:

实例演示2

对上篇的文件复制案例进行修改:

此处会报错的原因:

IDEA担心在finally执行之前,我们就已经把流给释放了,就会产生空指针异常;

或者是在流创建出来前(未赋值)就产生了异常,于是执行finally区的代码同样会空指针异常,

所以使用这个方法我们需要再嵌套一层try-catch

import java.io.*;

public class copyFile {
    public static void main(String[] args){
        InputStream is = null;
        OutputStream os = null;
        try {
            //需求:复制照片
            //1.创建一个字节输入流管道与源文件接通
            is = new FileInputStream("C:/Users/Administrator/Pictures/flower.jpg");

            //2.创建一个字节输出流管道与目标文件接通
            os = new FileOutputStream("C:/Users/Administrator/Desktop/test.jpg");

            //多加一条语句
            System.out.println(10 / 0);

            //3.创建一个字节数组,负责转移字节数据
            byte[] buffer = new byte[1024];     //1KB

            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少
            int len;    //记住每次读取了多少个字节
            while( (len = is.read(buffer)) != -1 ){
                os.write(buffer,0,len);
            }
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源的操作
            try {
                os.close();  //从内到外关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

try-catch-resource

介绍

JDK7开始提供了更简单的资源释放方案:try-with-resource

try(定义资源1;定义资源2;...){        该资源使用完毕后,会自动调用其close()方法,完成对资

        可能出现异常的代码;             源的释放

}catch(异常类名 变量名){

        异常的处理代码;

}

  •  ()中只能放置资源,否则报错
  • 资源一般指的是最终实现了AutoCloseable接口。资源都会有一个close方法

public abstract class InputStream implements Closeable{ }

public abstract class OutputStream implements Closeable,Flushable{ }

public interface Closeable extends AutoCloseable{ }

实例演示

同样改造一下文件复制的案例:

import java.io.*;

public class copyFile {
    public static void main(String[] args) throws Exception{
        try (
                //1.创建一个字节输入流管道与源文件接通
                InputStream is = new FileInputStream("C:\\Users\\Administrator\\Pictures\\flower.jpg");

                //2.创建一个字节输出流管道与目标文件接通
                OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.jpg");

                //注意:这里只能放置资源对象 (流对象)
        ){
            //需求:复制照片

            //3.创建一个字节数组,负责转移字节数据
            byte[] buffer = new byte[1024];     //1KB

            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少
            int len;    //记住每次读取了多少个字节
            while( (len = is.read(buffer)) != -1 ){
                os.write(buffer,0,len);
            }
            os.close();  //从内到外关闭流
            is.close();
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

END


学习自:黑马程序员——Java课程

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值