• java中流关闭及带资源的try语句(try-with-resource)作用


    一、IO流关闭顺序

    代码示例:

        public static void saveBase64(String data, String path, Long name) {
            OutputStreamWriter ops = null;
            BufferedWriter bw = null;
            File file;
            try {
                file = new File(path, name + ".txt");
                ops = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
                bw = new BufferedWriter(ops);
                bw.append("data:image/jpg;base64," + data);
            } catch (Exception e) {
                LOG.error(e.getMessage(), e);
                e.printStackTrace();
            } finally {
                try {if (bw != null) {
                        bw.flush();
                        bw.close();
                    }
                } catch (Exception e) {
                    LOG.error(e.getMessage(), e);
                    e.printStackTrace();
                }
            }
        }

    1.包装流(处理流)和节点流关闭

    概念:

    如果一个流的构造方法中需要传入流,那么这传入流称为“节点流”,此处的OutputStreamWriter就是节点流。

    外部负责包装的流,称为:包装流,也可以叫做处理流,BufferedWriter就是包装流。

    关闭:

    包装流的关闭,只需要关闭包装流即可,包装流的close方法会自动将节点流也关闭。

    2.按顺序关闭流

    如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内层关闭? 

    一般情况下是:先打开的后关闭,后打开的先关闭 

    另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b 

    例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b 

    当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法 

    如果将节点流关闭以后再关闭处理流,会抛出IO异常;

    二、try(){}语法含义

    代码示例:

     private static void saveBase64(String data, String path, Long name) {
            File file;
            file = new File(path, name + ".txt");
    
            try (OutputStreamWriter ops = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
                 BufferedWriter bw = new BufferedWriter(ops)) {
                bw.append("data:image/jpg;base64,").append(data);
            } catch (Exception e) {
                LOG.error("保存图片异常:{}", e.getMessage());
            }
        }

    try块退出时,会自动调用res.close()方法,关闭资源。不用写一大堆finally来关闭资源。

    所有实现Closeable的类声明都可以写在里面,最常见于流操作,socket操作,新版的httpclient也可以;

    需要注意的是,try()的括号中可以写多行声明,每个声明的变量类型都必须是Closeable的子类,用分号隔开

    参考: 

    1.IO 包装流关闭

    2.java中带参数的try(){}语法含义是什么?

  • 相关阅读:
    Ubuntu将Python3软连接到Python
    装有Ubuntu的硬盘插入到电脑中无法进入
    如何更改鼠标右键新建内容
    HDU 1113 Word Amalgamation
    暴力题,速算24点
    网络营销整合
    灰色预测代码
    灾情巡视C语言代码
    灰色关联度Matlab代码
    BP神经网络代码
  • 原文地址:https://www.cnblogs.com/weihuang6620/p/14107800.html
Copyright © 2020-2023  润新知