JAVA NIO

一.    Io与nio的区别

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

二.    Nio核心组成:

1.Channels(通道)

  (1) 主要的channel实现有:SocketChannel、ServerSocketChannel、FileChannel、DatagramChannel;

FileChannel:

从FileChannel读取数据只需调用read()即可,在下面讲解buffer实例中已经讲解;

向FileChannel中写入数据:

133528_zcgL_1470832.png

SocketChannel:

133544_F057_1470832.png

ServerSocketChannel:

133600_ws4x_1470832.png

(2)scatter/gather(分散和聚集)

       分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中;

例:

133614_p8cZ_1470832.png

聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel.

例:

133627_fgTy_1470832.png

 

2.Buffers(缓冲区)

   主要的buffer实现有:ShortBuffer、IntBuffer 、 LongBuffer、 FloatBuffer 、DoubleBuffer 、CharBuffer 、 ByteBuffer。

使用Buffer读写数据一般遵循以下四个步骤:

1.  写入数据到Buffer

2.  调用flip()方法

3.  从Buffer中读取数据

4.  调用clear()方法或者compact()方法

例:

133643_tW0C_1470832.png

在这里我们一定着重理解一下Buffer的capacity,position和limit三个属性:

Capacity:指定buffer大小值,例如上例:1024,一旦buffer满了,需要调用清除方法进行清除,才可以继续往里写数据。

Position:当前位置,初始值为0,最大值为capacity-1,当byte或long写入到buffer,会自动向前移动。

Limit:从字面意思就可以看出是最大范围,也就是buffer最多能往buffer中写入多少数据,在写模式下,limit等于Buffer的capacity,在读模式时,limit会被设置成写模式下的position值。

 

3.Selectors(选择器)

   Selector最大的特点就是允许单线程处理多个channel,如果要使用Selector,需要向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

例:133656_wJw6_1470832.png

 

 

 

转载于:https://my.oschina.net/u/1470832/blog/502265

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值