0
点赞
收藏
分享

微信扫一扫

Java NIO简介

時小白 2022-04-29 阅读 54
java

Java NIO简介

JDK1.4版本之前,Java IO类库是阻塞IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称 Java NIO,之前阻塞的称为Old IO,简称OIO。新的异步IO库的目标是让Java支持非阻塞IO,弥补OIO同步阻塞的不足,为标准的Java代码提供了高速的,面向缓冲区的IO。

Java NIO 三个核心组件

  • Channel (通道)
  • Buffer(缓冲区)
  • Selector(选择器)

Java NIO是属于IO多路复用模型,NIO组件提供了统一的API,为开发人员屏蔽了底层不同操作系统的差异。

NIO和OIO对比

  • OIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的。

    • 面向流

      指面向字节流或字符流,一般OIO操作中。以流式的方式顺序地从一个流(Stream)中读取一个或多个字节。因为顺序读取,所以不能随意改变读取指针的位置。

    • 面向缓冲区

      NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。读取和写入只需要从通道中读取数据到缓冲区,或将数据从缓冲区中写入到通道中。并不是顺序操作,所以可以随意读取Buffer中任意位置的数据。

  • OIO操作是阻塞的,NIO操作是非阻塞的。

    • OIO 阻塞

      调用一个read方法读取一个文件的内容时候,调用read的线程会被阻塞住,直到read操作完成。

    • NIO 非阻塞

      调用read方法时,如果此时有数据,则read读取数据并返回。如果此时没有数据,则read直接返回,而不会阻塞当前线程。依靠的就是使用了通道和通道的多路复用技术。

  • OIO没有选择器(Selector)的概念,而NIO有选择器的概念。

    NIO实现是基于底层的选择器的系统调用。

    NIO的选择器是需要底层操作系统提供支持,而OIO不需要用到选择器。

通道(Channel)

在OIO中,同一个网络连接会关联到两个流:一个输入流(Input Stream),另外一个输出流(Ouput Stream)。通过这两个流,不断地进行输入和输出的操作。

在NIO中,同一个网络连接使用一个通道表示。所以NIO的IO操作都是从通道开始。

一个通道类似于OIO中两个流的结合体,既可以从通道读取,也可以向通道写入。

Selector选择器

是一个IO事件的查询器,通过选择器,一个线程可以查询多个通道的IO事件的就绪状态。

从开发层面即,首页把通道注册到选择器中,然后通过选择器的内部的机制。查询(select)这些注册的通道是否有已经就绪的IO事件(例如可读,可写,网络连接完成等)

一个选择器只需一个线程监控,即使用一个线程就可以通过选择器去管理多个通道,

与OIO相比,使用Selector选择器的最大优势:系统开销小,系统不必为每一个网络连接(文件描述符)创建进程/线程,从而减少系统开销。

缓冲区(Buffer)

举报

相关推荐

0 条评论