NIO
1.Java NIO核心:http://ifeve.com/buffers/
a.Channels :所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中 主要channel:
从通道读取数据到缓冲区,从缓冲区写入数据到通道
b.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从写模式切换到读模式,读完后需要清空缓冲区)
使用Selector,得向Selector注册Channel,然后调用它的select()方法
- 写入数据到Buffer
- 调用flip()方法
- 从Buffer中读取数据
- 调用clear()方法或者compact()方法清空缓冲区
使用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) 收藏 举报
浙公网安备 33010602011771号