一,流
Java程序通过流来完成输入/输出,流通过Java的输入/输出系统与物理设备链接,一套输入/输出类和方法适用于所有类型的外部设备,这意味着一个输入流能够抽象多种不同类型的输入,从磁盘文件,从键盘或从网络套接字。
同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。
二,输入/输出流
1,输入/输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,数据数据流对程序来说是一个"输出数据流"(即数据流向程序为输入流,数据从程序流出为输出流)。
2,输入输出时,数据在通信通道中流动,信息通道就是一个数据流,只要是数据从第一个地方 "流" 到另外一个地方,这种数据流动的通道都可以称为数据流。
三,输入/输出类
从功能上分:输入流/输出流
从流结构上分:
字节流:以字节为处理单位
字符流:以字符为处理单位
字节流的输入流和输出流基础是 InputStream / OutputStream
字符流的输入,输出的基础是抽象类 Reader / Writer
注意:在最底层,所有的输入/输出都是字节形式的
分类:
字节流 字符流
InputStream Reader
OutputStream Writer
四,输入流
1,读数据的逻辑
open a stream
while more information
read information
close the stream
五,输出流
1,写数据的逻辑
open a stream
while more information
write information
close the stream
六,流的分类
1,节点流:从特定的地方读写的流类,比如:磁盘或一块内存区域
节点流是直接和设备打交道的,比如要从文件中读取信息,我们会创建一个FileInputStream流对象,FileInputStream是直接和文件相连的,因此它称为节点流
2,过滤流:使用节点流作为输入或输出,过滤流是使用一个已经存在的输入流或输出流链接创建的
我们可以对FileInputStream进行包装,比如包装成一个带缓冲的流(BufferedInputStream),BufferedInputStream就是一个过滤流,它一定是依附于一个节点流创建出来的(构造方法中接收节点流),节点流是和目的地直接交互的,过滤流是对节点流的包装,包装好的节点流还可以再次包装。
七,Java.io包中InputStream的类层次
FileInputStream
ByteArrayInputStream DataInputStream
InputStream --继承--> FilterInputStream --继承--> BufferedInputStream
ObjectInputStream LineNumberInputStream
PipedInputStream PushbackInputStream
SequenceInputStream
StringBufferInputStream
直接继承自FilterInputStream的是过滤流
直接继承自InputStream,而不继承FilterInputStream的是节点流
八,Java.io包中 OutputStream的类层次
FileOutputStream
ByteArrayOutStream DataOutputStream
OutputStream --继承--> FileterOutStream --继承--> BufferedOutputStream
ObjectOutputStream PrintStream
PipedOutputStream
九,IO流的链接:
1,InputStream Chain
文件 -----> FileInputStream -----> BufferedInputStream -----> DataInputStream -----> 数据
从文件中获取输入字节流 增加了缓冲的功能 增加了读取Java基本数据类型的功能,
2,OutputStream Chain
数据 -----> DataOutputStream -----> BufferedOutputStream -----> FileOutputStream -----> 数据
可以往输入流中写入Java基本数据类型 提供数据写入到缓冲区的功能 将数据写入到文件中
缓冲区其实就是一块内存区域,在NIO中可以指定内存区域的大小