前面我们学习了异常的处理,在IO流中,很容易出现异常。例如文件路径写错了,造成找不到文件,这种时候,由于IO流是底层的操作,我们不能使用抛出异常,而需要使用try 和finally语句。在Java1.6版本之前和Java 1.7之后,关于IO流的异常处理代码是有区别的,我们先来看Java1.6之前的代码,然后看看1.7以后的异常处理代码。
1.JAVA 1.6标准IO流异常处理代码
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4_TryFinally {
public static void main(String[] args) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("abc.txt");
fos = new FileOutputStream("coy.txt");
int b;
while ( (b= fis.read()) != -1 ) {
fos.write(b);
}
} finally {
try {
if(fis != null) {
fis.close();
}
} finally {
if (fos != null) {
fos.close();
}
}
}
}
}
上面,需要注意初始化对象等于null,如果不这么写,fis和fos就是局部变量,后面调用关闭方法就会报错。在关闭代码块,使用了嵌套finally语句,原因就是,在输入流和输出流两种关闭代码,遇到未知异常的时候,能关闭一个就关闭一个。
2.JAVA 1.7标准IO流处理代码
Java 1.7有一个新特性,在try的小括号里写流对象,这样执行try大括号里面写入文件代码就会调用自动关闭流的代码。
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4_TryFinally {
public static void main(String[] args) throws IOException {
try (
FileInputStream fis = new FileInputStream("abc.txt");
FileOutputStream fos = new FileOutputStream("copy.txt");
){
int b;
while ( (b = fis.read()) != -1) {
fos.write(b);
}
}
}
}
原因就是1.7中,能够实现自动关闭的类都是继承了AutoCloseable接口,这样新特性代码看起是简洁又很奇怪,了解有这么一种方式就好,一般常见的还是1.6版本之前的标准IO流异常处理代码。