IO是什么:IO是将数据从源头通过流的方式,输出到目的地。
BIO(Blocking IO):阻塞同步IO模型
(非常经典的IO类归纳图片,来自snailclimb)
流类的超类主要有
- java.io.InputStream
- java.io.OutputStream
- java.io.Reader
- java.io.Writer
IO流的分类:
按操作单位分:字节流和字符流
- 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。
- 字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类型数据。
按流向分:输出流和输入流
- 输出流:从内存读出到文件。只能进行写操作。
- 输入流:从文件读入到内存。只能进行读操
按操作角色分:节点流和处理流
- 节点流:直接与数据源相连,读入或读出。
- 处理流:在节点流的基础上实现的,是为了更加方便读写文件而出现的
常见Q&A:
字符流和字节流,我们该如何选择?
- 字节流是直接操作磁盘,当不需要对文件中的内容进行操作时,可以使用字节流直接存取文件。
- 字符流是经缓冲区(内存)的,在对文件中内容进行处理的时候使用较为高效
BufferReader的理解
- BufferReader是 字符读入处理流 ,该类将读入的内容放在缓冲区,可以使用readLine来读取内存中文件的一行内容。
NIO(Non-blocking IO):非阻塞同步IO模型
NIO 三个核心组件:
Buffer(缓冲区)
NIO 直接将数据读取或写入到 ByteBuffer 等对象中,而在 BIO 中,虽然也有 Buffer 的一些对象,但本质上还是通过流到缓冲区中。
Channel(通道)
NIO 通过 Channel 进行读或者写操作,不像 BIO 读写需要使用不同的对象。
Channel 与 Buffer 的配合使用使得 NIO 可以异步的完成读写操作。
Selector(选择器)
Selector 的出现,是为了让单个线程可以操作多个 Channel ,达到减少线程切换的操作,进而来提高相关的资源消耗。
NIO 与 BIO 的区别:
当线程N使用 NIO 读写文件时,线程N还可以继续做其他工作,当 Channel 读取或写入数据到 Buffer 后线程N再去处理数据;当线程B使用 BIO 读写文件时,只有读写操作结束后,才可以做其他操作。
AIO(Asynchronous IO):异步非阻塞模型
(目前没有什么大型开源项目在使用,有兴趣再去了解)
套接字使用的IO模型
BIO 模型中的 Socket 和 ServerSocket
NIO 模型中使用的 SocketChannel 和 ServerSocketChannel 完成相关数据请求。