NIO系列 Channel、Buffer和Selector

版权声明:原创文章,转载请注明出处,来自https://blog.csdn.net/Jacabe https://blog.csdn.net/Jacabe/article/details/80360733

     Channel(通道)和Buffer(缓冲)是新IO(NIO)的核心两个对象。

      Channel(通道) 

              Channel与传统的InputStream、OutputStream最大区别在于:

                               Channel提供了map()方法,可以直接把"一块数据"映射到内存,将Channel对应的部分或全部数据映射成ByteBuffer.

                                如果说 传统的输入输出系统 面向流的处理,Channel倾向于 面向块的处理

         

        Buffer 本质是一个数组,发送到Channel中的所有对象必须放到Buffer中,从Channel读取数据的时候也是把数据放到Buffer中,然后从Buffer中读取。常用子类是ByteBuffer.

          buffer:三个重要概念:容量(capacity),界限(limit)和位置(position)

          1、容量:缓冲区的容量表示该Buffer的最大数据容量,(最多可以存储多少数据)

           2、界限:不应该被读出或者写入的缓冲区位置,位于limit后的数据既不可被读,也不可被写。

            3、位置:下一个被读出的或者被写入的缓冲区位置索引。如果从channel中读取了1个数据到Buffer中,position为1.

          从Buffer中访问数据时,分为相对和绝对两种:(put()和get()方法)

                  1、相对:从Buffer的当前position处开始读取或写入数据,然后将position的值按处理袁术的个数增加

                   2、绝对:直接根据索引来向Buffer中访问数据类似数组根据下标来访问数据。 不会影响position的值

        Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。

                     使用Selector来实现 一个单独的线程可以管理多个channel,从而管理多个网络连接。

                      好处是只需要更少的线程来处理通道,只需要更少的线程来处理通道。

           描述三者的关系:例如: 上学的时候有个同学批发了很多零食在宿舍卖,而且提供送货上门的服务,只要公寓打电话来买东西,他就送过去,收钱返回来,然后再等下一个电话,如果请求多了就应付不过来了,所以电商用这个快递的新方式,将多件货一起发出去,在中转栈有专门的分拣员负责按配送范围把货物分给不同的配送员。

              Buffer就是所要送的货物,Channel就是送货员(或配送车),Selector就是中转站的分拣员。

              而Channel和Selector就像一个分拣员可以为多个地区分拣

               Selector可以通过其静态工厂方法open()创建货物而每个地区也可以有多个分拣员来分拣一样。

               Selector可以按不同类型来分拣,分拣的结果保存在SelectionKey中,可以分别通过SelectionKey的Channel方法和selector方法来获取对应的Channel和Selector,而且还可以通过isAcceptable,isConnectable,isReadable,isWritable方法来判断是什么类型的操作。

               Selector selector = Selector.open()

               创建后可以通过Channel的register方法注册到ServerSocketChannel或者SocketChannel上,注册完之后Selector就可以通过select方法来等待请求,select方法有一个long类型的参数,代表最长等待时间,如果在这段时间里接受到了相应操作的请求则返回可以处理的请求的数量,否则在超时后返回0,程序继续往下走.

               selector.select(3000)

               如果传入的参数为0或者调用五参数的重载方法,select方法会采用阻塞模式直到有相应操作的请求出现。当接收到请求后Selector调用selectedKeys方法返回SelectionKey的集合。

                 

猜你喜欢

转载自blog.csdn.net/Jacabe/article/details/80360733