1. IO流简介
IO即输入输出,IO流在Java中分为输入流和输出流,根据数据的处理方式又分为字节流和字符流。
Java IO流中的类都是从如下4个抽象类中派生出来的。
- InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
2. 字节流
2.1 字节输入流InputStream
InputStream用于从文件读取数据(字节信息)到内存中
2.2 字节输出流OutputStream
OutputStream用于将数据(字节信息)写入到目的地(通常是文件)
3. 字符流
不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
- 字符流是由 Java 虚拟机将字节转换得到的,这个过程还算是比较耗时。
- 如果我们不知道编码类型就很容易出现乱码问题。如果读取的文件中存在中文就容易出现乱码问题。
因此,I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
4. 字节缓冲流
IO 操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的 IO 操作,提高流的传输效率。
4.1 字节缓冲输入流BufferedInputStream
BufferedInputStream先将读取到的字节存放在缓存区,从内部缓冲区单独读取字节,减少了IO次数,提高读取效率
4.2 字节缓冲输出流BufferedOutputStream
BufferedOutputStream先将要写入的字节存放在缓存区,从内部缓冲区单独写入字节,减少了IO次数,提高读取效率