美文网首页Java问题研究
InputStream流关闭处理

InputStream流关闭处理

作者: OzanShareing | 来源:发表于2020-03-10 22:38 被阅读0次

问题的引入


InputStream inputStream = new FileInputStream(path);

InputStreamReader inputStreamReader= new InputStreamReader(inputStream , "utf-8");

BufferedReader bufferedReader= new BufferedReader(inputStreamReader);

在各种流使用完以后需要将每个流都关闭吗,还是只要关闭最外层或是最内层的流就行了?

只需要直接调用最外层的close()方法

这里先给出答案,有兴趣的朋友可以看下面测试内容:

测试


    InputStream inputStream = null;
    Reader reader = null;
    try {
        inputStream = CommonUtil.getConfigFilesStream(fileName);
        reader = new InputStreamReader(inputStream, "utf-8");
        int ch = 0;
        StringBuffer sb = new StringBuffer();
        while ((ch = reader.read()) != -1) {
            sb.append((char) ch);
        }
        jsonStr = sb.toString();
    } catch (Exception e) {
        log.error(">>>>>>>>>>>>>>>读取resources下的json文件出现异常,读取失败!<<<<<<<<<<<<<<<");
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
                log.error("reader流关闭发生异常");
            }
        }
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                log.error("InputStream流关闭发生异常");
            }
        }

        try {
            inputStream.read();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("InputStream 流已经被关闭了");
        }
    }

总结以下几点:

  1. 判断一个流是否被关闭,是没有提供直接的API方法判别的。这里要辟个谣,有人说可以通过判断比如inputStream == null来确认流是否被关闭,这是行不通的。

可根据:

        try {
            inputStream.read();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("InputStream 流已经被关闭了");
        }

如果被捕获到异常,则会显示当前流已经被关闭了。

  1. reader.close()方法执行后,也就是说外层包装流关闭了,就算inputStream未显式调用关闭方法,readerinputStream流都被关闭了。

  2. 可通过try,catch,finally去捕获流的异常,流的关闭一般会放在finally语句中执行。

    InputStream inputStream = null;
    Reader reader = null;
    try {
        inputStream = CommonUtil.getConfigFilesStream(fileName);
        reader = new InputStreamReader(inputStream, "utf-8");
        int ch = 0;
        StringBuffer sb = new StringBuffer();
        while ((ch = reader.read()) != -1) {
            sb.append((char) ch);
        }
        jsonStr = sb.toString();
    } catch (Exception e) {
        log.error(">>>>>>>>>>>>>>>读取resources下的json文件出现异常,读取失败!<<<<<<<<<<<<<<<");
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
                log.error("reader流关闭发生异常");
            }
        }
    }

相关文章

  • InputStream流关闭处理

    问题的引入 在各种流使用完以后需要将每个流都关闭吗,还是只要关闭最外层或是最内层的流就行了? 只需要直接调用最外层...

  • java I/O

    一.文件/文件夹File 二.InputStream/OutputStream字节输入输出流 三.关闭流的方式 四...

  • IO

    IO流:用于处理设备上的数据,即:InputStream,OutputStream IO流的具体分类:1,根据处理...

  • Java中的IO流

    Java中的IO流分类 输入IO流输入字节流(InputStream)处理流缓冲流(BufferedInputSt...

  • IO

    1、InputStream与OutStream的read write都是阻塞的 2、流打开后必须注意需要关闭 3、...

  • java IO流总结

    1. 流 流分为字节流和字符流. 1.1 字节流的基类 可以处理任何形式的文件. InputStream: 字节输...

  • JAVA-IO-InputStream解析

    Java.io.InputStream类声明了三个基本方法用来把byte数据写入到流中。当然也有用于关闭和刷新的流...

  • InputStream 流

  • 大数据量excel导入

    之前采用的是InputStream文件流的方式处理 对内存依赖极大,所以实际应用时,如果只能获取文件流的话,建议先...

  • 从Java异常处理到Java函数式编程

    一 、关闭流的异常处理 1、一般关闭方式 看下面这段代码,利用try-catch-finally关闭流。 上线代码...

网友评论

    本文标题:InputStream流关闭处理

    本文链接:https://www.haomeiwen.com/subject/nbindhtx.html