IO流家族层级结构图介绍(Java)

        在上一篇的IO流引入中,我们拿读写简单文本文件为例,说明了IO流在我们开发中最常用的一个场景,那么我们今天就来看看IO流究竟是什么,究竟能帮助我们干什么以及它的主要组成部分。

1,IO流是什么

        说白了,IO流就是java 平台类库提供给我们的用于处理数据的API,在java API中,我们从其中读入一个字节序列的对象为输入流(InputStream),反之,向其中写入一个字节序列的对象为输出流(OutputStream)。所以本质上来说,Java 中所有类似对象对应的类共同组成了我们所说的IO流。

2,IO流能干什么

        在说其功能之前,我们简单的看一下下面这张图:

很简单,但这就是IO流功能的概括,用于在不同的存储位置间传递数据,至于传递什么类型的数据,如何高效的传递数据以及如何保证传递数据的安全性等等,就延伸除了不同的IO流。这些不同种类的IO流就形成了我们Java当中的IO家族。

3,IO流家族的组成

其实了解IO流小伙伴都知道,IO流的分类有很多种方式,比如按传输的数据基本单位类型分,按流的方向分等;那我们这里就顾名思义一下,先按最简单最直观的方式分一下,I(In)O(Out)流也就是输入输出流,其实也就是我们常说的:

  • InputStream (Reader):输入流
  • OutputStream(Writer):输出流

除了这种,还有就是按传输的数据单位来分:

  • Reader,Writer:字符流
  • InputStream,OutputStream:字节流

说到这里,我们在上一篇用的主要API基本上都出来了,那么下面就来看看Java中关于IO这一块的API究竟有多少,我们先看字节流相关API组成以及层级结构:

哇,看着有一点多,但是没有关系,我们先简单对上图进行简要的说明,在后续我们会对其中的主要API进行逐一详细的介绍的;关于上图有以下几点说明:

  • 上图源于《Java 核心技术》卷2
  • 其中矩形表示Class,八边形表示Interface
  • 其中绿颜色矩形表示使用相对较多的API(后续可能会变,因为我也是在学习的过程中,只是结合自己的使用频率来的)
  • 实现接口本应该使用虚线,我这里使用和继承一样的实线,不好意思

目前,关于本图的解释就到这里了,至于InputStream和OutputStream是字节输入输出流的基类以及FilterInputStream和其子类实际上是采用了装饰者设计模式的关系等等这样的说明,在本篇不展开,后续会逐一介绍。上面就是IO流家族中的字节流家族,虽然可以把IO流家族分为字节流和字符流两种,但是这部分在IO流家族中占比是肯定不止一半的。Ok,说完了字节流,下面就来看看字符流的家族组成:

其实我不说你也能明白,为什么字符流占不到半壁江山了,但是不得不说,我们在平时的读写文件中,基本上使用的都是字符流,因为我们编码读写的通常都是文本文件,而针对不同的编码使用字节流读取这些文本文件可能会有问题,而且字符流读写本身在性能上就有优势,所以,这部分看似类容不多,但是在我们的开发中使用的频率还是蛮高的,这里也是同样,关于上图给出如下几点说明:

  • 上图源于《Java 核心技术》卷2
  • 矩形表示Class,其中绿颜色矩形表示使用相对较多的API(后续可能会变,因为我也是在学习的过程中,只是结合自己的使用频率来的)
  • 字节流不便于处理以Unicode形式存储的信息的理解

其实到这里,IO流家族成员就列举完了,但是有一点需要注意,那就是下面的几个接口:

后续我们会说到,关于流使用完之后要释放资源的问题,通常我们都是通过调用close()方法,所以这里可以看出,字节流和字符流的基类都是实现了Closeable接口的;Appendable接口就不用多说了,我们在使用StringBuilder的时候就经常使用Appendable中的方法append(),关于该接口的详细类容在后续会有介绍。

好的,今天关于IO流家族的组成部分就介绍到这里了,你可能觉得平时我们就使用那么几个API开发就够了,用得着这么多吗,但是请你相信,IO流家族这么庞大并不是大部分API没有用,只是我们没有尝试去用,或者说我们所做的东西的要求不需要考虑那么多,但是请相信,知道不用和不知道怎么用还是不一样的。就好比是在电影《钱学森》中,陈坤饰演的钱学森在被问道为什么要搞原子弹时说的:“手中没剑和手中有剑不用那是不一样的”一样。扯远了,今天就到这里了。

猜你喜欢

转载自blog.csdn.net/hfut_why/article/details/83720228