NIO

1.Java NIO核心:http://ifeve.com/buffers/
   a.Channels :所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中
        主要channel:  从通道读取数据到缓冲区,从缓冲区写入数据到通道
   b.Buffers:缓冲区本质上是可以读写的内存区域
        
       
        capacity:相当于Buffer的大小   position:buffer对应的当前位置,最大为capacity-1;当buffer从写模式转为读模式,postion置为0
         limit:最多能忘buffer里写多少数据,写模式下limit等于Buffer的capactiy
         inChannel.read(buf);  //读数据     buf.put(123);//写数据
         flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
         Buffer.rewind()将position设回0,所以你可以重读Buffer中的所有数据。limit保持不变,仍然表示能从Buffer中读取多少个元素
         compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。
        一般buffer的操作流程:(写入数据之后,读取数据时,需要通过flip()将buffer从写模式切换到读模式,读完后需要清空缓冲区)
    1. 写入数据到Buffer
    2. 调用flip()方法
    3. 从Buffer中读取数据
    4. 调用clear()方法或者compact()方法清空缓冲区
   c.Selectors  Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便,
        使用Selector,得向Selector注册Channel,然后调用它的select()方法
   d.scatter/gather(通道)
        分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。
        聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel

FileChannel:FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。
  e.channel.truncate(1024);  截取文件的前1024个字节,文件将中指定长度后面的部分将被删除。
  f.FileChannel.force(true)方法将通道里尚未写入磁盘的数据强制写到磁盘上。
SocketChannel:
  h.SocketChannel socketChannel = SocketChannel.open();
  i.socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
Pipe:

    NIO与IO对比: 
1.IO是面向流的
    a.每次从流中读一个或多个字节,直至读取所有字节,没有被缓存在任何地方,不能前后移动流中的数据
    b.当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入
2.NIO是面向缓冲区的

    a.数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。增加了处理过程中的灵活性;
       但要检查是否该缓冲区中包含所有需要处理的数据,并确保不覆盖缓冲区尚未处理的数据

    b.Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据

选择器:

  Java NIO的选择器允许一个单独的线程来监视多个输入通道,可以通过注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道













posted on 2018-03-06 18:10  xiaojiayu0011  阅读(143)  评论(0)    收藏  举报

导航