java ,返回流,IOException: Stream Closed,TryWithResource

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/82882496

Java 1.7中新增的try-with-resource语法糖来打开资源,而无需码农们自己书写资源来关闭代码

为了能够配合try-with-resource,资源必须实现AutoClosable接口。该接口的实现类需要重写close方法:

public class ConnectionClone implements AutoCloseable {

    public void sendData() {
        System.out.println("正在发送数据");
    }

    @Override
    public void close() throws Exception {
        System.out.println("正在关闭连接");
    }
}
    public static void main(String[] args) {
        try (ConnectionClone conn = new ConnectionClone()) {
            conn.sendData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出:

正在发送数据
正在关闭连接

    public static void main(String[] args) {
        InputStream is = new TryWithResource().f1();
        byte[] data = new byte[1024];
        try {
            is.read(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("文件内容:" + new String(data));
    }

    public InputStream f1() {
        File file = new File("D:\\00t1.txt");
        try (InputStream is = new FileInputStream(file)) {
            return is;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

java.io.IOException: Stream Closed
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:233)

原因:不要把InputStream当作返回类型,同一个流对象又要返回又要close是矛盾的!!!可以使用void,byte[],或者String

    public static void main(String[] args) {        // 指定构造文件
        File file = new File("D:\\00t1.txt");        // 将文件构建为输入流
        try (InputStream is = new FileInputStream(file)) {            // 创建字节数组
            byte[] data = new byte[1024];            // 从文件流中读取数据,存储到缓冲字节数组
            is.read(data);            // 输出文件内容
            System.out.println("文件内容:" + new String(data));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

能正确读取。

关于异常:

public class ConnectionClone implements AutoCloseable {

/*    public void sendData() {
        System.out.println("正在发送数据");
    }

    @Override
    public void close() throws Exception {
        System.out.println("正在关闭连接");
    }*/

    public void sendData() throws Exception {//方法内抛出了一个异常,那么在这个方法内,需要catch处理或者继续向上抛出异常
        throw new Exception("send data");
    }

    @Override
    public void close() throws Exception {
        throw new Exception("close");
    }
}
    public static void main(String[] args) {
        try (ConnectionClone conn = new ConnectionClone()) {
            conn.sendData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出:

java.lang.Exception: send data
    at testpackage.ConnectionClone.sendData(ConnectionClone.java:20)
    at testpackage.TryWithResource.main(TryWithResource.java:17)
    Suppressed: java.lang.Exception: close
        at testpackage.ConnectionClone.close(ConnectionClone.java:25)
        at testpackage.TryWithResource.main(TryWithResource.java:18)

从Java 1.7开始,大佬们为Throwable类新增了addSuppressed方法,支持将一个异常附加到另一个异常身上,从而避免异常屏蔽。

扫描二维码关注公众号,回复: 3589455 查看本文章

参考《深入理解 Java try-with-resource 语法糖》

https://juejin.im/entry/57f73e81bf22ec00647dacd0

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/82882496