一、IO流作用
IO流就是用来处理设备上的数据,包括文件,磁盘,网络等
二、分类
按处理的数据类型不同:字符流、字节流
按流向不同:JAVA 中流的处理是单向的,分为输入流和输出流
三、抽象类
1、字节流抽象类
InputStream 输入流
OutputStream输出流
2、字符流抽象类
Reader 输入字符流
Writer 输出字符流
四、JAVA中流体系架构

有一些对流进行操作的基本的方法,我们以文件输入输出流进行说明:
1、InputStream是所有的输入字节流的父类,它是一个抽象类

假如有个文件a.log 里面存放的数据是

(1)read() 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值
通常的用法是

返回值

(2)read(byte[]) 从输入流中读取的一定数量字节数并将它们存储到缓冲区数组中
通常的用法是:

返回值为:
aaa
2、OutputStream是所有输出字节流的子类,他也是一个抽象类

(1)write(int) 写入一个0-255范围的int字节到输出流

然后我们发现b.log里的内容为a:

(2)write(byte[]) 写入byte数组中的数据到输出流

然后我们发现b.log文件中的数据为123

3、Reader是所有的输入字符流的父类,它是一个抽象类
简单使用方式同InputStream,例子如下

4、Writer是所有的输出字符流的父类,它是一个抽象类
简单使用方式同OutputStream,例子如下

写入到b.txt文件的数据

五、IO流中的设计模式
JAVA中的IO流有很多种,但是都会按照需要继承InputStream,OutputStream,Reader,Writer的一种,同时为了更好的扩展这些类,采用了装饰者模式。
1、首先举一个简单的例子

比如上面这个文件输入流,会读取文件中的字节,然后打印出来,如果我们要增强这个类,比如要使用缓冲区怎么办,我们可以使用BufferedInputStream

我们查看一下BufferedInputStream的构造函数

发现这个函数实例化的时候需要传一个InputStream,然后在我们的例子中fileInputStream是继承了InputStream的类,所以我们可以交给BufferedInputStream使用,同时BufferedInputStream也会继承
InputStream的抽象类,那么就一定会实现抽象类的所有方法,进而实现了类的增强,其他的类同理
六、使用规律总结
(1)明确要操作的数据是数据源还是数据目的(要读还是要写)?
源:InputStream Reader
目的:OutputStream Writer
(2)明确要操作的设备上的数据是字节还是文本?
字节:InputStream
文本:Reader
字节:OutputStream
文本:Writer
(3)明确数据所在的具体设备?
硬盘:文件 File开头
内存:数组,字符串
键盘:System.in
网络:Socket
(4)明确是否需要额外功能?
需要转换—转换流 InputStreamReader OutputStreamWriter
需要高效—缓冲流 Bufferedxxx
多个源—序列流 SequenceInputStream
对象序列化—ObjectInputStream,ObjectOutputStream
保证数据的输出形式—打印流PrintStream Printwriter
操作基本数据,保证字节原样性—DataOutputStream,DataInputStream
