InputStream流关闭处理

问题的引入

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 流已经被关闭了");

总结以下几点:

  • 判断一个流是否被关闭,是没有提供直接的API方法判别的。这里要辟个谣,有人说可以通过判断比如inputStream == null来确认流是否被关闭,这是行不通的。
  •         try {
                inputStream.read();
            } catch (IOException e) {
                e.printStackTrace();
                log.error("InputStream 流已经被关闭了");
    

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

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

  • 可通过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();