一 名词解释
- IO是洋文简写,I就是input,输入,O就是output,输出。
IO翻译就是输入输出。就是数据传输。
数据传输是个动态的过程,从一方出去,从一方进来。 - 流,是数据流的意思。流是个动态概念。
从中文字面来理解,很形象,就想象成水流。从水龙头流出,流入杯子中。
数据流也是这个意思。用来数据传输的。
数据流这个概念一开始是通信领域的概念,出现在1998年。
数据传输的过程中,数据是按着规则排好队,然后一下一下地传送,一”流”一”流”地传,数据流是个含义很丰富的概念,更多了解参阅数据流的相关博文,此处不表。 - IO流,这就是说明有两个流,输入流,输出流。输入流就是读,而且是只读不写。输出流就是写,而且是只写不读。再加上数据传输,初学者在这里很容易搞不清,什么时候是输入,什么时候是输出。这里涉及到三对概念:
输入和输出,读和写,发送和接收,可以对照一下下面的表 :
输入 | 读 | 接收 |
---|---|---|
输出 | 写 | 发送 |
二 Java当中的IO流
现在我们 知道,流是用来处理和传输数据的。
那么,很自然的,数据不一样。流就不一样。
这里就涉及到对数据进行分类的问题,角度不同,分类就不同。
第一个角度,数据的类型
流是用来传输处理数据的,那么它最小单位的传输数据应该是多大呢?
一共分为两个字节流,字符流
字节流的处理单元就是一个字节。
字符流的处理单元就是一个Unicode字符,是两个单元的。
硬盘上的文件存储的真相是这样的:
有一个文件,里边内容是字符的,
要把这个文件存到硬盘上,
那就要把文件中的字符按照一个编码规则编码成为字节,
然后再把这些字节存储到硬盘上。
真相就是硬盘上存储的都是字节。
读文件的时候就是: 字节–> 编码–>字符–>显示
写文件的时候就是 : 字符–> 编码–> 字节–>存储
根据上面的这个真相就能知道 :
字节流是能够处理任何类型的文件或者对象的。
就是有个缺陷,不能直接处理Unicode字符(两个字节)。
字符流就是专门用来处理Unicode字符(两个字节)的。处理字符和字符串。
所以,根据上面的描述可以知道什么时候用什么流。
如果你要处理音频,视频,图片,歌曲,那么请用字节流。
IO操作跟文件内容无关的时候,就用字节流。
如果你要处理文本尤其关系到中文的,请用字符流。
IO操作跟文件内容有关的时候,就用字符流。
Java当中有这么多乱七八糟的流,怎么进行区分?
Stream结尾的都是字节流。
reader和writer结尾的都是字符流
具体的两者之间的区别可以总结到下面的表格当中
流 | 处理单位 | 处理文件类型 | 不能处理文件类型 | IO应用情景 | ||
---|---|---|---|---|---|---|
字节流 | 一个字节 | 视频,音频,图片等一切文件 | Unicode | 操作与文件内容无关时 | ||
字符流 | 两个字节 | 文本,字符串 | 除了文本都不能 | 操作与文件内容相关时 |
第二个角度,数据的来源
仔细想想,数据是可以从来源方面,做个大致的区分的。
第一种,可以简单叫做静态数据,直接读取物理介质当中的数据。比如硬盘,内存,U盘。处理和传输这种数据,就要用节点流。
第二种,可以简单叫做动态数据,就是用流进行传输的时候,流中的数据。处理和传输这种数据,就要用处理流。
- 在这里可以简单理解,节点流就是对付文件,数组等等乱七八糟的,处理流对付的就是其他的流。
- 所以处理流的类当中的构造方法,肯定有一个参数是一个流的对象。因为处理流就是”处理”其他流的。用构造方法初始化的时候,肯定要传入一个流对象。
- 把一个节点流对象传给一个处理流,封装起来了。再把这个处理流传给第二个处理流,再封装一下。可以接着进行很多次封装,这个就叫做流的链接。说点专业的词汇就是:基本输入输出流,经过流的嵌套变成装饰流。
1 节点流
节点流用来对付的东西,有文件,数组,字符串,管道等。相应的,肯定有针对这些东西的输入输出流类。这样分类细致了,就可以抽出来点共同的特征,组成个父类。
节点流的父类,有四个两对: InputStream和OutputStream,Reader和Writer
具体地可以对照一下下面的表中,这都是些常用的节点流。
父类 | InputStream | OutputStream | Reader | Writer |
---|---|---|---|---|
1.文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
2.数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
3.字符串 | StringReader | StringWriter | ||
4.管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
2 处理流
处理流,就是用来对付流的。扩展流的一些功能的。
涉及到功能,就不像上面一样了,就不太好总结分类了。
比如加缓冲功能,流转换等,这功能是不能罗列完的。
处理流的父类跟节点流是一样一样的。
经常用的处理流可以对照下面的列表。
父类 | InputStream | OutputStream | Reader | Writer | 功能 |
---|---|---|---|---|---|
1.缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter | 增加缓冲功能,有flush方法 |
2.转换流 | InputStreamReader | OutputStreamWriter | 字节流转换成字符流 | ||
3.数据流 | DataInputStream | DataOutputStream | 把基础数据类型写入文件 | ||
4.打印流 | PrintStream | PrintWriter | 扩展输出流,方便打印各类型数据 | ||
5.对象流 | ObjectInputStream | ObjectOutputStream | 读写对象 | ||
6.XML流 | XMLReader | XMLWriter | 读写xml文件 |
三 对流的理解
java当中如果遇到相同类型的数据要处理,就用数组集合什么的。把这些个东西叫做容器。其实,流也可以理解成一种容器。
在进行数据传输的时候用的都是字节流,在进行数据操作的时候用的都是字符流。操作不同类型的数据用的都是节点流,给流进行封装扩展功能用的都是处理流。
比方说有数据要进行传输,那就是涉及到网络编程的问题。我们就是先把数据放到流当中,然后再通过流进行传输。
流是流动的意思,流动不断,是动态的。这就可以看成是火车一样的这样运载容器。