IO异常的处理

IO异常的处理

JDK7前处理

使用try catch finally 处理流中的异常

格式:

	try{

​		可能会产生的异常代码

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

​		异常的处理逻辑

​	}finally{

​		一定会执行的代码

​		释放资源

​	}


示例代码:

public static void main(String[] args) {
        // 提高变量fw的作用域,让finally可以使用
        // 变量在定义的时候,可以没有值,但是使用的时候必须有值
        // fw = new FileWriter("Q:\\Test\\e.txt");执行失败,fw没有值,fw.close会报错
        FileWriter fw = null;
        try {
            // 可能会产生异常的代码
            fw = new FileWriter("D:\\Test\\e.txt");
            for (int i = 1;i<10;i++){
                fw.write("HelloWorld"+i+"\r\n");
            }
        }catch (IOException e){
            // 异常的处理逻辑
            System.out.println(e);
        }finally {
            // 一定会执行的代码
            // 创建对象失败了,fw的默认值是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在释放资源
            if(fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

JDK7的处理(扩展知识点了解内容)

还可以使用JDK7优化后的try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。

JDK7的新特性

在try的后边可以增加一个(),在括号中可以定义流对象

那么这个流对象就在try中有效

try中的代码执行完毕,会自动释放流对象,不用写finally

格式:

try (定义流对象;定义流对象  如果多个,使用';'隔开) {
	可能会产生异常的代码
} catch (异常类变量  变量名) {
	异常的处理逻辑
}

示例代码

public static void main(String[] args) {
        try (
                // 1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
                FileInputStream fis = new FileInputStream("c:\\Test\\1.jpg");
                // 2.创建一个字节输入流对象,构造方法中绑定要写入的目的地
                FileOutputStream fos = new FileOutputStream("d:\\Test\\1.jpg");
                ){
            // 可能会产生异常的代码
            // 一次读取一个字节写入一个字节的方式
            // 3.使用字节输入流对象中的方法read读取文件
            int len = 0;
            while ((len = fis.read())!=-1){
                // 4.使用文件字节输出流中的方法write,把读取到的文件写入目的地
                fos.write(len);
            }
        }catch (IOException e){
            System.out.println(e);
        }
}

JDK9的改进(扩展知识点了解内容)

JDK9中try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close,我们来了解一下格式。

改进前格式:

// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:创建新的变量保存
try (Resource r1 = resource1;
     Resource r2 = resource2) {
     // 使用对象
}

改进后格式:

// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");

// 引入方式:直接引入
try (resource1; resource2) {
     // 使用对象
}

改进后,代码使用演示:

public class TryDemo {
    public static void main(String[] args) throws IOException {
       	// 创建流对象
        final  FileReader fr  = new FileReader("in.txt");
        FileWriter fw = new FileWriter("out.txt");
       	// 引入到try中
        try (fr; fw) {
          	// 定义变量
            int b;
          	// 读取数据
          	while ((b = fr.read())!=-1) {
            	// 写出数据
            	fw.write(b);
          	}
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

posted @ 2020-04-11 23:04  _Anke  阅读(558)  评论(0编辑  收藏  举报