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();
}
}
}