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

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

          借鉴博文:http://www.cnblogs.com/skywang12345/p/io_01.html  该博主写的非常好,自己重新写一遍是因为想按照自己的思路进行总结,方便日后自己复习。有雷同是肯定的。谢谢

                            --WH

一、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流时会将是那样的格式进行编写,将一个流的实例放入另一个流的构造方法中?

时间: 2024-07-30 10:59:54

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

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

装饰者模式-轻松记住IO类的关系与API

一.目录 二.概述与模型 1.概述 含义:控制对对象的访问. 作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理. 优点: 缺点: 2.模型 Component(抽象组件):定义代理角色和真实角色的公共对外方法. ConcreteComponent(真实组件):实现抽象角色,定义真实角色所要实现的真实业务逻辑,供代理角色调用. Decorator(抽象装饰者):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽

Java集合框架的接口和类层次关系结构图

%E7%94%A8groovy%E8%84%9A%E6%9C%AC%E8%BF%9B%E8%A1%8C%E6%AF%8F%E6%97%A5%E5%B7%A5%E4%BD%9C%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96groovy http://auto.315che.com/zhiyue/qa23760388.htm?437o http://auto.315che.com/jingyi/qa23872297.htm http://auto.315che.com/xi

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html http://sundensky.blog.163.com/blog/static/7728873420109299167434/ 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类关系

UML类图关系表示方法

本文转载: http://blog.csdn.net/fengsh998/article/details/8105631 分类: UML2012-10-24 10:18 1175人阅读 评论(0) 收藏 举报 UML类图关系的表示方法,主要包括关联,聚合,泛化,实现,依赖等内容,希望通过本节的学习大家对UML类图关系的表示方法有一定的掌握.下面是具体介绍. UML基础 1:UML类间关系的种类 2:关联 UML类图关系中关联描述了系统中对象或实例之间的离散连接,关联带有系统中各个对象之间关系的信

黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或文件夹封装成对象 (2)方便于对“文件”与“文件夹属性信息”进行操作 (3)File对象,可以作为参数传递给流的构造函数 (二)构造方法 * 通过File的构造函数创建File对象 方式1:File f = new File("c:\\a.txt"); 方式2:File f2 = newF

JDK中ClassLoader的分类以及ClassLoader间的层次关系

几个常见的ClassLoader: bootstrap  class  loader: 最早启动的class  loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个class  loader你动不了,也没有名字,打印出来是空值. 1,负责先把其他的class loader   load进来,然后其他class  loader再load其他class 2,load  jre最核心的类,最核心的rt.jar拿出来把里边的class load进来. extension

C++的那些事:流与IO类

1.流的概念 "流"就是"流动",是物质从一处向另一处流动的过程,比如我们能感知到的水流.C++的流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为"流". 为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能.根据一个流类定义的对象也时常被称为流. 通常标准输入或标准输出设备显示器称为标准流

【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性:  实现 指的是一个class类实现interface接口(可以是多个)的