Java问题研究

InputStream流关闭处理

2020-03-10  本文已影响0人  OzanShareing

问题的引入


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流关闭发生异常");
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读