资源的释放方式try-catch-finally, try-catch-resource

1:try -catch-finally(基本做法)

try{

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

        异常的处理代码

}finally{

        执行所有资源释放操作

}

手动释放资源

作用:finally代码块是最终一定要执行的(除非把虚拟机干掉 system.exit(0)),可以在代码执行完毕的最后用于释放资源

package io流;

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

public class Test8 {

	public static void main(String[] args)  {
			
			InputStream io=null;//定义到上面一会finally好访问
			OutputStream ot=null;
			try {
				new FileInputStream("src/aaa.txt");
				new FileOutputStream("D:/www.txt");
				byte[] arr=new byte[1024];
				int len;
				while((len=io.read(arr))!=-1) {
					ot.write(arr, 0, len);
				}

				System.out.println("文件拷贝成功");
			} catch (IOException e) {			
				e.printStackTrace();
			}finally {
				try {
					if(io!=null) {// 防止上面已经把流关了,你这里在关就会报错
						io.close();
					}
					if(ot!=null) {
						ot.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			

	}

}

释放资源的代码放在finally语句块中,

如果不放在finally,可能前面你的语句出了异常,你的关闭资源的代码就没有机会执行

还有一个注意事项

package io流;

public class Test10 {

	public static void main(String[] args) {
		System.out.println(div(10, 2)); //返回的是100
		

	}
	public static double  div(int a,int b){
		try {
			double c=a/b;
			return c;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			System.out.println("-----finally被执行------");
			return 100;	//哪怕上面有return 语句执行,也必须先执行这里才可以
			//开发不建议在这里加return 如果加了这个方法会一直打印100
		}
		
		
	}

}

哪怕上面有return 语句执行,也必须先执行finally这里
 开发不建议在这里加return 如果加了这个方法会一直打印100

2:JDK7改进方案(最常用)

try(定义流对象){

}catch(){

}
 

资源用最终自动释放



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Test9 {
//JDK7改进方案

	public static void main(String[] args)  {
		try (//这里只能放置资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)
				InputStream io=new FileInputStream("src/aaa.txt");
				OutputStream ot=new FileOutputStream("D:/www.txt");
				//int a=1;//报错这里只能写资源
					){
	
			byte[] arr=new byte[1024];
			int len;
			while((len=io.read(arr))!=-1) {
				ot.write(arr, 0, len);
			}
			System.out.println("文件拷贝成功");
		} catch (IOException e) {			
			e.printStackTrace();
		}
}
}

JDK7以及JDK9的()中只能放置资源对象,否则报错

补充什么是资源?

资源都是实现了Closeable或者AutoCloseable接口的类对象

例如

public static class InputStream implenments Colseable{}

public static class OutputStream implenments  Closeable,Flushable{}

3:JDK9改进方案(适用于别人给你传过来的流)

定义输入流对象; (必须完成初始化)

定义输出流对象;

try(输入流对象 ;输出流对象){

}catch(){

}

资源用完最终自动释放



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Test11 {
	//JDK9改进方案
	public static void main(String[] args) throws Exception  {
		InputStream io=new FileInputStream("src/aaa.txt");
		OutputStream ot=new FileOutputStream("D:/www.txt");//定义的流必须完成初始化
		try (io;ot){
	
			byte[] arr=new byte[1024];
			int len;
			while((len=io.read(arr))!=-1) {
				ot.write(arr, 0, len);
			}
			System.out.println("文件拷贝成功");
		} catch (IOException e) {			
			e.printStackTrace();
		}
}
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萌新上大分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值