IO流
相信很多小伙伴学到 IO 流就被各种类型的流看花了眼,这里我也是做了一些自己在学习过程中遇到的问题和总结,希望能够帮助到大家
流的分类
- 按操作数据单位不同可分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色不同分为:节点流,处理流
什么是输入流和输出流呢?(节点流、处理流)
类似于水流的概念,举个通俗易懂的栗子,就好比水库、我们家里的水和污水之间的关系。对于程序和文件而言,我们通常站在程序的角度看待来区分输入和输出。从文件中读取数据就是向程序中输入数据,我们称为输入流,就像从水库把水运到我们家里一样,而输出流恰好相反,就是从程序中向文件中写入数据。这样我们称为输出流。那么是什么节点流和处理流呢?对于节点流而言,就相当于直接从水库看把水运送到我们家里,中途是不经过任何处理的,也就是说直接从文件中读取数据送到程序中,这样的流我们称之为节点流,而处理流就是作用在已有的流的基础上的,这样的我们称之为处理流,可以理解为水库得水经过了净化池之后到我们家里
要注意的是对于Java中的一般情况下,我们看它的父类都是通过后缀来看的,比方说,FileInputStream,后缀是InputStream类型的,也就是字节输入流,同理InputStreamReader,后缀是Reader类型,所以是字符输入流。Java中的IO流共涉及40多个类,实际上都是非常规则的,都是从以下四个抽象基类派生的
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
那么,了解了基本的流之间的关系后,我们该怎么选择使用哪一种流呢
通常对于文本文档的输入和输出我们经常使用字符流,因为字符是char定义的类似于’a’或者’b’这样的,而我们文本文档中的内容也是这样的字符构成的,所以使用字符流比较合适,而且字符流通常不会引起汉字的乱码(由于各种编码格式中汉字所占的字节不同,使用字节流的时候可能会出现把一个汉字分几瓣的情况)。那么什么时候该使用字节流呢?我们知道,对于字节流而言,是八位的二进制编码,对于不能直接读取字符输入或输出的内容我们使用字节流,比如说,我们需要加载图片或者视频,这样的情况我们使用字符流显然是不合适的,因为图片和视频的底层实际上是01的二进制编码
IO流体系
下面是我总结的一些流的相关信息,重点的流我用斜体加粗标记出来了
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | ChayArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputSreamWriter | ||
对象流 | ObjectInputSream | ObjectOutputStream | ||
FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream | DataOutputStream |
好了,这就是我今天为大家带来的全部内容了,这些都是一些基本的流之间的关系,想要灵活的使用这些流还需要勤加练习,多写代码,由于流的中类实在太多了,我就不在这里对流进行一一介绍了,以后有机会我还会写出来根据具体的代码来解释相关知识的。