JavaSE(一) IO类层次关系和各种IO流的用法总结

简介: 今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于整个IO体系中的什么位置,对于其中的整个IO体系一点不了解,每次使用的时候都需要百度查看用法例子,这就说明自己对这块的知识有所欠缺,所以今天,来详细的分析,解剖一下IO的整个结构。

      今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于整个IO体系中的什么位置,对于其中的整个IO体系一点不了解,每次使用的时候都需要百度查看用法例子,这就说明自己对这块的知识有所欠缺,所以今天,来详细的分析,解剖一下IO的整个结构。

                            --WZY

一、IO流的分类                                
    1.1、按数据流的方向分为 输入流、输出流

        此输入、输出是相对于我们写的代码程序而言,

        输入流:从别的地方(本地文件,网络上的资源等)获取资源 输入到 我们的程序中

        输出流:从我们的程序中 输出到 别的地方(本地文件), 将一个字符串保存到本地文件中,就需要使用输出流。

    1.2、按处理数据单位不同分为 字节流、字符流

         1字符 = 2字节 、 1字节(byte) = 8位(bit) 、 一个汉字占两个字节长度

       字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码,

        字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文。

    1.3、按功能不同分为 节点流、处理流

       节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream 

        处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,

       这里就涉及到了装饰者模式,在后面会详细讲解该模式在IO中的体现。

    1.4、4个基本的抽象流类型,所有的流都继承这四个。

           输入流      输出流

      字节流  InputStream  outputStream

      字符流  Reader      Writer

      inputStream:字节输入流

      outputStream:字节输出流

      Reader:字符输入流

      Writer:字符输出流

     

    1.5、总结流的分类

        看上面的几个分类,可能对于初次学io的同学会感觉到有些混乱,那什么时候用字节流,什么时候该用输出流呢?其实非常简单,举一个例子就学会了,

        1、首先自己要知道是选择输入流还是输出流,这就要根据自己的情况而定,如果你想从程序写东西到别的地方,那么就选择输出流,反之用输入流

        2、然后考虑你传输数据时,是选择使用字节流传输还是字符流,也就是每次传1个字节还是2个字节,有中文肯定就选择字符流了。

        3、前面两步就可以选出一个合适的节点流了,比如字节输入流inputStream,如果要在此基础上增强功能,那么就在处理流中选择一个合适的即可。

二、4个基本抽象类的继承关系分析                            

     2.1、InputStream 字节输入流

          

       2.1.1、认识每个类的功能即作用

           现在就认识一下即可,详细的功能会在后面的博客中写出来。

         ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿

         PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信

         FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了

              BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高

              DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”

         FileInputSream:文件输入流。它通常用于对文件进行读取操作

            File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。

         ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象,

      2.2、OutputStream 字节输出流

              

          具体分析在上面分析过了,只不过和inputStream是相对的,但作用是相同的。

      2.3、Reader 字符输入流

                

           功能也差不多,类似。这里分析一个。

           InputStreamReader:转换流 将 字节输入流 转换为 字符输入流。它是字节流通向字符流的桥梁

      2.4、Writer 字符输出流

                  

三、装饰者模式的运用                                    

      3.1、什么是装饰者模式?

            推荐一篇博文,http://blog.csdn.net/jason0539/article/details/22713711 就详细说明了什么是装饰者模式?用我自己的话来说,就是往一个添加更多的功能,而我们首先想到的是继承,继承就很好的符合了我们的要求,不管你想加多少层的功能,都可以使用继承一层层的实现,但是这带来了一个问题,一旦我需要改变我的需求,那么我就需要往源码中改东西,再就是在这个继承链中某个类做一些修改,这不符合我们的设计模式思想,所以就有了装饰者模式,装饰者中拥有被装饰者的实例,然后有什么具体的装饰我们都另写一个类来继承该装饰者,当我们需要该装饰时,就new出该类来,然后将其被装饰者当作参数传递进去。

                  

          关说可能没理解那么清楚,现在来看看一个具体的实例。比如,我们需要制作一份鸡腿堡,流程是怎样的呢?看下图

              1、先有基本原料,也就是两块面包,这是不管做什么汉堡都需要的,

              2、做什么汉堡,取决于加什么材料,比如生菜,鸡肉等,所以根据材料来做汉堡,想做什么汉堡就加什么材料

              3、所有材料加完之后,直接计算价格即可

            这样使用装饰者模式,是不是比一直使用继承方便的多的多呢?换一种汉堡,也不需要改源码,什么也不需要,希望你能够理解清楚其中的思想。

                    

      3.2、io流中的装饰者模式的运用

            画张图,在结合源码和自己写的代码来看。

                  

          到这里,应该可以对前面的处理流和节点流有所理解了把,其实处理流就是一个具体的装饰者,而节点流就是被装饰者。

四、总结                                        

       4.1、应该知道io流的各种类的结构关系,平常我们使用的io类是处于什么样的位置,是一个什么样的流(节点流还是处理流,输入流还是输出流,字节流还是字符流)

       4.2、装饰者模式在io流中的运用和什么是装饰者模式

       4.3、为什么在使用io流时会将是那样的格式进行编写,将一个流的实例放入另一个流的构造方法中?

相关文章
|
3月前
|
Java
缓冲流和转换流的使用【 File类+IO流知识回顾③】
这篇文章介绍了Java中缓冲流(BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter)和转换流(InputStreamReader, OutputStreamWriter)的使用,包括它们的构造方法和如何利用它们提高IO操作的效率及处理字符编码问题。
缓冲流和转换流的使用【 File类+IO流知识回顾③】
|
3月前
|
存储 Java 调度
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
这篇文章回顾了Java中FileInputStream、FileOutputStream、FileReader和FileWriter类的基本使用方法,包括读取和写入文件的操作,以及字符流和字节流的区别和应用场景。
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
|
3月前
|
Java
File类的基本使用【 File类+IO流知识回顾①】
这篇文章回顾了Java中File类的基本使用,包括创建File对象、获取文件数据信息、判断文件存在与否、创建和删除文件目录,以及遍历文件目录的方法。
File类的基本使用【 File类+IO流知识回顾①】
|
3月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
4月前
|
Java
IO流操作-------File类、输入流和输出流(二)
这篇文章介绍了Java中IO流操作的基本概念和使用,包括字节流和字符流的读取与写入,以及如何使用缓冲流提高文件读写效率和实现文件复制的方法。
IO流操作-------File类、输入流和输出流(二)
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
52 2
|
4月前
|
Java
IO流操作-------File类(一)
这篇文章介绍了Java中File类的常用操作,包括创建文件/文件夹、删除文件、查询文件属性(如存在性、大小、名称、路径)以及递归遍历文件夹下所有文件的方法。
IO流操作-------File类(一)
|
4月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
58 3
|
5月前
|
存储 缓存 Java
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(二)
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(二)
|
5月前
|
存储 Java
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(一)
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(一)