Java NIO的基本介绍



NIO基本介绍

  • Java NIO:​ Java New IO

  • 是一个可以替代标准Java IO API的IO API
  • Java NIO提供了与标准IO不同的工作方式

通道和缓冲区

  • 通道和缓冲区:​ Channels and Buffers

  • 标准IO是基于字节流和字符流进行操作的
  • NIO是基于通道Channel和缓冲区Buffer进行操作:

  • 数据总是从通道读取到缓冲区
  • 数据总是从缓冲区写入到通道


非阻塞IO

  • 非阻塞IO:​ Non-blocking IO
  • Java NIO可以非阻塞地使用IO:

  • 当线程从通道读取数据到缓冲区时,线程还可以进行其余操作;当数据被写入到缓冲区时,线程也可以进行其余操作
  • 当数据从缓冲区写入到通道时,线程也可以进行其余操作

选择器

  • 选择器:​ Selectors

  • 用于监听多个通道的事件. 比如连接打开,数据到达
  • 单个线程可以监听多个数据通道

NIO核心组件

  • Java NIO的核心组件:

  • Channels
  • Buffers
  • Selectors

Channel和Buffer


  • 所有的​IO​在​NIO​中都是从一个​Channel​开始的
  • Channel​类似数据流:

  • 数据可以从​Channel​读到​Buffer​中
  • 数据也可以从​Buffer​读到​Channel​中

  • Channel的主要实现:​ 涵盖了UDP和TCP网络IO以及文件IO

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

  • Buffer的主要实现:​ 覆盖了能通过IO发送的基本数据类型-byte,short,int,long,float,double,char

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer
  • Java NIO中还有一个​MappedByteBuffer,​ 用于表示内存映射文件


Selector


  • Selector允许单线程处理多个Channel:

    • 如果应用打开了多个连接通道,但是每个连接的数据流量都很低,使用Selector就会很方便

  • 示例:​ 在一个单线程中使用一个​Selector​处理3个​ChannelJava中的NIO详解Day01-Java NIO基本介绍_网络
  • 要使用​Selector,​ 得向​Selector​注册​Channel,​ 然后调用​Selector​中的​select()​ 方法 .
  • 这个方法会一直阻塞到某个注册的通道有事件就绪.一旦这个方法返回,线程就可以处理这些事件,比如新连接和数据接收等