zoukankan      html  css  js  c++  java
  • Java IO包装流如何关闭?

    问题:

    (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗?

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

    问题(1)解释:

    复制代码
    如下例子代码:
      FileInputStream is = new FileInputStream(".");   
      BufferedInputStream bis = new BufferedInputStream(is);  
      bis.close();
    

    从设计模式上看:
    java.io.BufferedInputStream是java.io.InputStream的装饰类。
    BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。

    BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
    java.io.BufferedInputStream的api:
    close
    public void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。

    复制代码

    因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:

    复制代码
    public static void main(String[] args) throws Exception {
            FileOutputStream fos = new FileOutputStream("d:\a.txt");
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write("java IO close test");
    
        bw.close();
      
     }<br><br>验证ok</span></pre>
    
    复制代码

    问题(2)解释:如果不想使用(1)方式关闭流,可以逐个关闭流(可能大家比较习惯吧)

    复制代码
    如下例子: 
    public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("d:\a.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write("java IO close test");
        </span><span style="color: #008000;">//从内带外</span><span style="color: #008000;">顺序顺序会报异常</span>
    

    fos.close();
    osw.close();
    bw.close();

     }<br>报出异常:<br></span></pre>
    

    Exception in thread "main" java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:99)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.BufferedWriter.close(BufferedWriter.java:246)
    at com.my.test.QQ.main(QQ.java:22)


    如下例子:
     public static void main(String[] args) throws Exception {
            FileOutputStream fos = new FileOutputStream("d:\a.txt");
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write("java IO close test");
    
        </span><span>//</span><span> 从外到内顺序关闭ok</span>
    

    bw.close();
    osw.close();
    fos.close();
    }

    验证ok

     
    复制代码

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

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

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

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

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

  • 相关阅读:
    员工年龄排序之桶排序
    滑动窗口中最大值
    开机自动启动Tomcat
    基于RXTX的串口通讯 windows64位系统可用
    一些SQL
    Java 实现文件上传、下载、打包、文件copy、文件夹copy。
    Page-encoding specified in XML prolog (UTF-8) is different from that specified in page directive (utf-8)
    Java -> 把Excel表格中的数据写入数据库与从数据库中读出到本地 (未完善)
    (转)解决:本地计算机 上的 OracleOraDb10g_home1TNSListener服务启动后停止
    PHP、Java对称加密中的AES加密方法
  • 原文地址:https://www.cnblogs.com/jpfss/p/9835038.html
Copyright © 2011-2022 走看看