//注意:此处需要提前声明局部变量 并初始化为空
//否则下方的 finally处无法使用fis.close关闭流
FileInputStream a= null;
BufferedInputStream b=null;
DataInputStream c=null;
try {
a=new FileInputStream( "file ");
b=new BufferedInputStream(a);
c=new DataInputStream(b);
//此处可以实现对流的操作 此处省略
//此处默认会生成IOException、FileNotFoundException等异常 较为繁琐
//可以直接捕捉父类异常 Exception
} catch (Exception e) {
//打印异常信息
e.printStackTrace();
//由于finally一定执行 故将关闭流操作放到finally语句块中
} finally {
//如果文件输入流不是null 关闭流
if(fis != null) {
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
b.close();
a.close();
} catch (Exception e) {
e.printStackTrace();
}//错误的关闭方式;
}
为什么不能在try()里面关闭流,如果说你先打开了一个流,然后你处理这个流的逻辑错了,那么其实这个流并没有被关闭,所以需要放到finally来处理关闭流的操作
为什么finally不直接关闭还要判断,因为如果你是打开流这过程就错了,那么其实这个流并没有被创建,那么其实关闭这个流其实就是错误的关闭,会报控制针异常,而这个异常不会不会被IOException 给抓住,这样就会导致后面的流不会继续关闭,可以直接用Exception去抓,这样就不用判断了
流关闭需要有顺序,从外向内,那么为什么上面那一起关闭错了呢,因为你如果没有抓住流的错误,那么比如说你在创建b流的时候错了,那么执行b.close()的时候会报错,然后报错之后就不会执行后面的a.close()了
所以其实需要每个关闭流都要抓一下
finally {
//如果文件输入流不是null 关闭流
if(fis != null) {
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
b.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
a.close();
} catch (Exception e) {
e.printStackTrace();
}
}
其实我个人也有点疑惑,就是说假如我这个java程序就是一个一次性的,中间的逻辑其实报错就退出了,或者是没有报错正常执行完毕了,那么是否我就不需要有关闭这个流的这个操作呢,因为在我看拿来java程序已经退出了那么流其实就应该关闭了,不知道又没有大佬能回答我这个问题,百度到的都是什么流不关闭会怎么怎么样,
那假设我没有在程序里写关闭流的方法,程序已经正常运行完了,那么这个流不应该会自己关闭吗,那么我关闭流的方法到底有什么意义呢