流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
输入输出(IO)与流的概念:
输入输出(IO)是指计算机同任何外部设备之间的数据传递。常见的输入输出设备有文件、键盘、打印机、屏幕等。数据可以按记录(或称数据块)的方式传递,也可以 流的方式传递。
IO流的作用:
数据在各个设备之间的传输,是通过流的方式完成的
IO流分类:
根据流动方向的不同,流分为输入流和输出流(相对于内存,输入和输出)
根据流的格式不同,流分为字节流和字符流
-
程序中的输入和输出都是以流的形式保存的,流中保存的实际上全是字节文件。
-
所有文件的存储都是字节(byte)来存储,在磁盘上保留的并不是文件的字符,而是先把字符编码成字节,再存储这些字节到硬盘上,在读取时也是一个一个的读取以形成序列
根据流的功能不同,又分为节点流和处理流
-
节点流:可以从某节点读数据或向某节点写数据的流
-
处理流:对已存在的流的连接和封装,实现更为丰富的流数据处理,提高流读写效率
字节流的抽象父类:
-
InputStream字节输入流, OutputStream字节输出流
-
派生出来的子类名称都是以其父类名作为子类名的后缀
-
如:InputStream的子类FileInputStream
-
字符流的抽象父类:
-
Reader 字符输入流, Writer字符输出流
-
派生出来的子类名称都是以其父类名作为子类名的后缀
在IO流里,输入输出分为4步:格式化/解析,缓冲,编码转换和传递。
格式化/解析:在内部数据表示(以字节为单位)与外部数据表示(以字符为单位)之间进行双向转换。例如一个2字节的整数10002,就需要5个字符来表示。
缓冲:用于在格式/解析与传递之间缓存字符序列。对于输出,较短的字符序列格式化之后并不马上输出,而是保存在缓冲区里,待累积到一定规模之后再传递到外部设备。相反,从外部设备读入的大量数据也是先放在缓冲区,然后逐步取出完成输入。默认时,IO流的输入输出都是经过缓冲的,也可以让IO流工作在无缓冲模式下。
编码转换: 是将一种字符表达式转换成另一种字符表达式。如果格式化产生的字符表达式与外部字符表达式不同(输出时),或者外部表达式与IO流能解析的表达式不同(输入时),就必须进行编码转换。如多字节编码与宽字符编码之间的转换等。多数情况下并不需要进行编码转换。
传递:主要是与外部设备进行通信。输出时,传递负责将经过格式化、缓冲即编码转换后的字符序列发送到外部设备;输入时,则负责将外部设备抽取数据,为其后进行的编码转换、缓冲及解析提供字符序列。