BIO、NIO、AIO概览与应用

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来读取内存中文件的一行内容。

Blocking IO具体用例参考

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 完成相关数据请求。

发布了91 篇原创文章 · 获赞 54 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BigBug_500/article/details/102861587
今日推荐