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

Posted 二十六画生的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java ,返回流,IOException: Stream Closed,TryWithResource相关的知识,希望对你有一定的参考价值。

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方法,支持将一个异常附加到另一个异常身上,从而避免异常屏蔽。

 

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

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

以上是关于java ,返回流,IOException: Stream Closed,TryWithResource的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

抛出 java.io.IOException: 当我尝试从服务器下载 txt 文件时,http:/ 上的流意外结束

j2me:打开流时出错 - “java.io.IOException:-7334”

将对象列表转换为映射Java 8流

坑爹微信之读取PKCS12流时出现的java.io.IOException: DerInputStream.getLength

第十八章 Java I/O流