美文网首页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流关闭处理

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