记NIO初步阅读

### 个人笔记 纯属印象记忆 切勿轻信 ###

NIO概念始自JDK1.4,意为New IO,相对于IO名为流的概念,NIO一般成为channel,通道。

IO为单向阻塞的,NIO为双向非阻塞。单向即一个IO流,要么是读,要么是写,而NIO的通道支持读写双向进行。所谓阻塞与非阻塞,也只是相对来说的,针对数据来说,在读或者写的时候,必定都是阻塞的,这不难理解,为了保证数据的完整性,一致性。那么NIO的非阻塞是指什么呢?这是针对网络层的说法,NIO的通道在网络上的数据交互,是支持双向非阻塞的。

NIO的channel通道不会单独存在,必定依赖一个缓存区,buffer。例如ByteBuffer,StringBuffer等。这个缓存区涉及到JVM的内存机制。一般服务器操作系统会给JVM分配一个内存区域供JVM运行使用,同时也会另外分配一个区外内存,也叫直接内存。任何从缓存区写入数据到磁盘,或者从磁盘读取数据到缓存区,都必须经过通道。

NIO两种模式:读模式---从通道中读取数据到缓存区;写模式---将缓存区数据写入通道。

缓存区buffer有几个属性:mark=-1---重复读标记,一般用不到;position---buffer下标指针当前所在位置,类似游标;limit---可以从字面意思理解,限制,在读buffer的时候,他指明读取到position所在位置就已经到末尾了,在写buffer的时候,他指明写到这已经到末尾了,所以在写的时候,position和buffer的容量属性capacity相同的;capacity---容量,一般情况下,他代表buffer的分配容量。操作NIO的channel和buffer时,时刻对于pisition和limit当前所在位置有清晰认知很重要,掌握了这两个属性,基本掌握了NIO基础操作。

注意操作buffer时,不要过多在意所谓的读模式和写模式,那都是相对channel来说。对于buffer来说,从channel读数据就相当于向buffer写数据。所以在channel读模式的时候,要调整position和limit的位置,limit当然要跳到最后,和capacity在一起,指明buffer末尾,position要调整到buffer中已有数据的末尾,表明新写入数据从该位置向后接着写。写模式当然也好理解了,向channel写数据,即是从buffer读数据。position当然要跑到buffer开头,这样才能在读buffer数据的时候从头开始读,limit要调整到buffer中现有数据的末尾位置,表明读到这就可以了,再向后读就没数据了。buffer.flip()这个方法是实现这一操作的关键。

----读模式

channel = AccessRandomFile.getChannle();//构建通道

ByteBufer buffer ---> new [1024];//分配缓存区

channel.read(buffer);//读模式,从通道读取数据到缓存区

buffer.flip();//很重要,此操作以为反转buffer状态。我的理解是调整buffer的position和limit的位置。

channel.close();

----写模式

channel = AccessRandomFile.getChannle();//构建通道

ByteBufer buffer ---> new [1024];//分配缓存区

buffer = "abcd";

buffer.flip();

channel.write(buffer);

channel.close();

猜你喜欢

转载自www.cnblogs.com/jerry-yu/p/9186127.html
NIO