`

IO 包装流关闭

    博客分类:
  • java
 
阅读更多
援引了一位网友的解释, 自己稍加改动, 保存留用

(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();
      
     }



验证ok


问题(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");
       
        //从内带外顺序顺序会报异常
        fos.close();
        osw.close();
        bw.close();

     }


报出异常:
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");

        // 从外到内顺序关闭ok
        bw.close();
        osw.close();
        fos.close();
    }



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

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

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

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

如果将节点流关闭以后再关闭处理流,会抛出IO异常;
分享到:
评论

相关推荐

    IO流pdf宝典

    ### JAVA IO流概念及其应用详解 #### 一、JAVA为何引入流的概念? 在JAVA中,引入流的概念主要是为了实现对各种类型数据的高效处理。在实际应用中,无论是从网络中传输数据还是从本地文件中读取数据,亦或是与用户...

    Java IO 字节流 字符流

    同时,Java 7引入的try-with-resources语句可以更好地管理IO流的关闭,防止资源泄漏。 总的来说,理解Java的IO系统,特别是字节流和字符流的概念,对于开发高效、可靠的程序至关重要。通过选择合适的流类型、使用...

    JAVA IO流技术

    - 功能差异:节点流直接连接到数据源或目的地,如`FileInputStream`,而处理流不直接连接,它们是其他流的包装,如`BufferedInputStream`,用于提高性能。 5. 节点流与处理流的关系:节点流位于IO操作的第一线,...

    Java基础篇:IO流.pdf

    Java IO流的使用涉及到流的打开、数据的读写操作和流的关闭。正确地使用流可以避免内存泄漏和其他资源问题。在实际开发中,通常会结合try-catch-finally语句来确保即使发生异常也能正确关闭流。 总结来说,Java IO...

    Java 的 IO流笔记.md

    这类流被称为“包装流”,如`BufferedInputStream`, `BufferedReader`等。 #### 七、Java中的IO流体系结构 Java的IO流体系主要包括以下几种流: - **FileInputStream/FileOutputStream**:节点流,用于以字节为...

    彻底明白java中的IO流

    Java中的IO流是Java核心库java.io中的关键组成部分,它为程序提供了与外部资源交互的能力,包括文件读写、标准设备输入输出等。Java的IO流机制基于流的概念,流可以被视为数据传输的通道,数据按照序列化的方式从...

    java基础 IO流

    示例代码中展示了一个读取和写入文件的标准流程:首先创建对应的流对象,然后进行读写操作,最后关闭流以释放资源。如读取文件时,通过循环调用`read()`方法,将数据读入到字节数组或字符数组中;写入文件时,将数据...

    java io 流,文件读取操作

    节点流是最基本的流类型,处理流是节点流的包装类,提供了更多的功能。 二、IO 流的四大抽象类 Java 中的 IO 流有四大抽象类:InputStream、OutputStream、Reader 和 Writer。这四个抽象类是所有 IO 流的基类,...

    java IO流详解

    - **按处理效率**:分为节点流(低级流)和包装流(高级流)。 - 节点流:直接与设备交互,效率较低。 - 包装流:对节点流进行封装,提高读写效率,例如缓冲流。 #### 二、InputStream/OutputStream - **...

    java IO流+socket源码 实现简单文本传输

    Java IO流和Socket是Java编程语言中用于处理输入输出和网络通信的重要概念。在这个示例中,我们将深入探讨如何利用Java IO流与Socket实现简单的文本传输。对于初学者来说,理解这两个概念及其交互是非常关键的。 ...

    C#技术开发IO流

    3. `Stream` 类是所有流的基础抽象类,提供了对字节流的通用操作,如读写、定位和关闭流。 4. `FileStream` 是基于文件的 `Stream` 实现,支持同步和异步读写操作。 5. `MemoryStream` 用于在内存中创建流,通常用于...

    Javaio流思维导图

    最后,别忘了关闭流的重要性。每当完成I/O操作后,都应调用close()方法释放资源,防止资源泄露。 总的来说,Java I/O流是一个复杂而强大的系统,它涵盖了数据的读取、写入、转换、缓冲、多线程通信等多个方面。通过...

    javaio流电子书整理面试必考io流帮助你入职阿里腾讯

    3. **按功能与应用对象划分**:包括节点流(直接连接到数据源/目的地)和处理流(对已有流进行包装,增加额外功能)。 **三、InputStream与OutputStream** InputStream代表所有字节输入流的抽象基类,其read()方法...

    Java IO流完整解读

    在实际应用中,通常会使用缓冲流来包装基础的字节流,如`FileInputStream`和`FileOutputStream`,以提高性能。 4. **第三方库Apache Commons IO**:在`FileCopyByCommonsTest()`方法中,使用了Apache Commons IO库...

    java io流学习笔记1

    - 处理流(Filter Stream):也叫包装流,不直接与数据源或目的地关联,而是包裹在节点流之上,提供额外的功能,如BufferedInputStream。 三、Java IO流的常用类 1. FileInputStream和FileOutputStream:用于文件...

    java IO 流详细分析

    ### Java IO流详细分析 #### 一、Java IO流概述 在Java中,输入/输出(Input/Output,简称IO)操作是程序与外部设备进行数据交换的重要方式。Java提供了丰富的API来支持各种类型的IO操作,包括文件读写、网络通信...

    Java IO流.pdf

    3. 按照处理对象的不同,流可以分为节点流和处理流(或包装流)。节点流直接与数据源或目的地相连,如`FileInputStream`。处理流不直接操作数据源,而是用来包装其他流,提供额外的功能,如缓冲、格式转换等,例如`...

    黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件).zip

    Java语言在处理输入输出操作时,使用了IO流(Input/Output Stream)技术,这是Java标准库中的核心功能之一。本教程《黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)》专注于讲解如何利用IO流来...

    javaIO(java中的流的介绍)

    Java IO提供了过滤流(Filter Stream),可以对已有流进行包装,添加额外的功能或修改其行为,例如: - FilterInputStream 和 FilterOutputStream 用于包装字节流,可以添加缓冲、压缩等功能。 - FilterReader 和...

    607.605.JAVA基础教程_IO流与网络编程-复习:IO流概述(607).rar

    8. 滤流器流:FilterInputStream和FilterOutputStream是所有包装流的基类,如DataInputStream和DataOutputStream可以添加额外的功能,如读写基本数据类型。 9. 标准流:System.in、System.out和System.err代表标准...

Global site tag (gtag.js) - Google Analytics