Java NIO 之 NIO 简介

    Java NIO 全称 Java non-blocking IO,是jdk1.4之后推出的new IO api,为所有的原始类型(boolean除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

    Java NIO 由三个核心部分组成:

  • Buffers         缓冲区
  • Channels     通道
  • Selectors     选择器
     其中,Channels对应之前IO中的流,Buffer是Channels两端的缓冲区,Selectors是因为nio可以使用同步的非阻塞方式而加入的东西。以前所有的流都是阻塞的,一个线程只要对其操作,其他操作就会被阻塞,相当于一个没有水管的阀门,当你伸手接水时,不管水到没到,你只能等水出来并流完。
    而nio中,Channels的加入,相当于增加了有阀门的水龙头,虽然一个时刻只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各个水管里流出来的水都可以依次接到,这里的关键之处就是增加了Selectors作为接水工。它负责协调,切换水管。
    当我们需要用水的时候,就实现提了一个水桶给接水工,这个水桶就是Buffers。也就是,我们不需要阻塞在等水这个操作上,而是让别人去做(另一个线程中的接水工),等水满了,接水工会通知我们。

Channel 和 Buffer

    基本上,所有的NOI都是从Channel开始,Channel类似于流。数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中。在nio包中,主要有以下几种Channel实现:
  • FileChannel                         文件IO
  • DatagramChannel               UDP的IO
  • SocketChannel                    套接字的IO
  • ServerSocketChannel         服务器端套接字的IO
    这些通道涵盖了文件IO、UDP和TCP的网络IO。
    以下是Java NIO中主要Buffer的实现:
  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer
    涵盖了除了boolean之外的所有基本数据类型。此外,还有个 Mappedyteuffer,用于表示内存映射文件。

Selector

    Selector允许单线程处理多个Channel,如果你的应用打开了多个通道,但每个流量都很低,使用Selector就会很方便。只需要向Selector注册Channel,然后调用select()方法,这个方法会一直阻塞到注册的通道有你所感兴趣的事件就绪。一旦这个方法返回,线程就可以处理这些事件。

猜你喜欢

转载自blog.csdn.net/u010771890/article/details/76576592