如何通过try-catch自动实现IO流的关闭

如何通过try-catch自动实现IO流的关闭

在jdk1.7版本中通过在try后增加一个()在()中创建IO流的对象,默认就会

在我们学习的常用的异常处理中,语法为

try{
}catch(Exception e){
}

而该方法无法实现IO流的错误分离。我们来参考下述代码。

try{
	FileReader fr = new FileReader("lmz.txt");
	int s = fr.read();
	System.out.println(s);
	fr.close();
}catch (Exception e){
	e.printStackTrace();
}

上述代码我们发现我们将创建的IO流的对象和关闭流的方法放到了一个捕获异常的语句中,当该代码块内容出错时我们无法确认时创建对象的错误,还是关闭流的方法的错误。

想要分离异常,需要变得非常复杂,代码如下:

	FileReader fr = null;
	try{
		fr = new FileReader("lmz.txt");
		int s = fr.read();
        System.out.println(s);
    }catch (IOException e){
        e.printStackTrace();
    }finally {
        try {
            fr.close();
       }catch (Exception e){
           e.printStackTrace();
       }
	}

为防止代码过于复杂,在jdk1.7中,Java新增了异常语句,在try语句后加()括号内添加一条实现了AutoCloseable接口的方法。

try(FileReader fr = new FileReader("lmz.txt")){
	int s = fr.read();
	System.out.println(s);
}catch (IOException e){
	e.printStackTrace();
}

其功能为默认在finally语句中执行close方法。

其中FileReader fr = new FileReader(“lmz.txt”);语句默认实现了AutoCloseable接口。

AutoCloseable接口的功能就是必须包含close方法,满足包含close的方法后,在try-catch-finally语句中的finally语句中默认自动执行close方法。

在jdk1.9中实现了,在()内传入实现AutoCloseable的对象名称即可自动在finally语句中执行close方法,参考代码如下:

public class Demo {
    public static void main(String[] args) throws IOException {
        CloseDome cd = new CloseDome();
        CloseDome2 cd2 = new CloseDome2();
        try(cd;cd2){
        }catch (Exception e){
        }
    }
    static class CloseDome implements Closeable{
        @Override
        public void close() throws IOException {
            System.out.println("close方法被调用1");
        }
    }
    static class CloseDome2 implements Closeable{
        public void close() throws IOException{
            System.out.println("close方法被调用2");
        }
    }
}

该代码会打印出:
close方法被调用1
close方法被调用2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值