为什么有IO流?
IO流的产生
数据要传输,必定就有输入端和输出端,也就是数据的读入和数据的读出。Java中数据分为基本数据类型和引用类型,基本类型就是字节,任何数据都可以用字节来传输,也就是字节流,可是这个过程中有可能会发生乱码,因为读取的时候可能只读取了一个字节(比如:中文,1个中文是两个字节),也就是半个字符,导致了乱码,因此新出现了字符流,专门用于处理字符的。
从此,化为两道,字节流和字符流
字节流继承自InputStream、OutputStream
字符流继承自 Reade、Writer
IO流功能和作用
主要是方便数据 的传输 不同设备之间的数据传输
在如下地方均可传输
硬盘:File 键盘:System.in 内存:数组 网络 : Socket流
## 什么是IO流?
![](https://img-blog.csdnimg.cn/20200923220606475.png#pic_center)
**形象化的比喻**
(1)我们知道,每个人家里喝的水都是从自来水厂来的,自来水厂的水又是从水源地来的
(2)水是通过水管来的
(3)那么这当中的水流,便可以理解为IO流。
**Java中的IO流**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923220754707.png#pic_center)
(1)在java中,java就是自来水厂,水源地就是源,家就是目的
(2)对于自来水厂当做参照物来说,从水源地流到我自来水厂的水,是从外面进来的,那么水是输入进来的。(输入)
从自来水厂到家的水,是从自来水厂流出的(输出)。
对于java程序来说,也是一样的,从源地到我java中的流,便是输入流(InputStream),而从我java中流出的便是输出流(OutputStream)
(3)那么你已经知道什么是输入流(InputStream)和输出流(OutputStream)了。
Java的IO模型设计非常优秀,它使用Decorator(装饰者)模式,按功能划分Stream,您可以动态装配这些Stream,以便获得您需要的功能。 例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。
## IO流分类?
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221524122.png#pic_center)
**字节流**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221642417.png#pic_center)
如果是文件的操作,则带file
**字符流**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221825808.png#pic_center)
BufferedReader BufferedWriter
**缓冲区**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221019479.png#pic_center)
(1)当我们需要水的时候,那么一个储水池能够更好的满足我们,能够让我们想要水就有水。提高的水到效率
(2).java中的这个储水池叫做缓冲区,(Buffered?)一个用于特定基本类型数据的容器。
那么这个(问号)?是什么意思呢?我们知道储水池有很多种类型的,那么java中的缓冲区自然也有很多种类型的,例如以下最常用的
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221102817.png#pic_center)
我们已经知道的InputStream是输入流,那么BufferedInputStream就是输入流的缓冲区了;同样,那么OutputStream是输出流,那么BufferedOutputStream就是输出流的缓冲区了;
**转换流**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923221342446.png#pic_center)
是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写
(1)同样的 ,java中的转换流,相当于过滤器,是一种对数据进行编码,改变格式的存储;如下:
可以将字符以指定编码格式存储。
可以对文本数据指定编码格式来解读
指定编码表的动作由构造函数完成
(2)分为InputStreamReader OutputStreamWriter
使用: InputStreamReader isr = new InputStreamReader(is, "gbk");
使用: OutputStreamWriter osw = new OutputStreamWriter(os, "ISO-8859-1");
参考:https://www.cnblogs.com/xiaoshen666/p/11118864.html
## IO流选择?
1、首先自己要知道是选择输入流还是输出流,这就要根据自己的情况而定,如果你想从程序写东西到别的地方,那么就选择输出流,反之用输入流
2、然后考虑你传输数据时,是选择使用字节流传输还是字符流,也就是每次传1个字节还是2个字节,有中文肯定就选择字 符流了。
3、明确具体设备
硬盘:File 键盘:System.in 内存:数组 网络 : Socket流
4、是否需要额外功能
A)高效缓冲 buffer
B)字节字符流之间转换
字节转字符流 InputStreamReader
字符转字节流 OutputStreamWriter
可以参考: https://www.cnblogs.com/penghuster/p/4869153.html