(1)buffer
NIO通信中数据不会和通道直接交互。对于读来说,数据总是先从通道读到缓冲,应用程序再读缓冲的数据。对于写,数据也是先写入缓冲,再通过通道把缓冲的数据发送出去。
缓冲区本质上是一块可以读写的内存,这块内存被包装成NIO Buffer对象,并提供了一组方法来访问该内存。
(2)重要属性
- capacity:Buffer内存块的大小。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据。
- position:当前的位置。初始的position值为0。数据读写到Buffer后,position会移动到下一个可读写数据的Buffer单元。position最大可为capacity–1。读取数据时,也是从某个特定位置读。Buffer从写模式切换到读模式,position会被重置为0。
- limit:写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。写模式下,limit等于Buffer的capacity。切换Buffer到读模式时,limit表示你最多能读到多少数据,这时候,limi为写模式下的position值。
- (3)方法
- 每一个Buffer类都有allocate方法在堆上或者直接内存上分配
- 写数据到Buffer有两种方式:读取Channel写到Buffer,inChannel.read(buf);通过Buffer的put()方法写到Buffer,buf.put。flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值
- 从Buffer中读取数据有两种方式:从Buffer读取数据写入到Channel, inChannel.write(buf);使用get()方法从Buffer中读取数据,buf.get()。调用flip()方法从写模式切换到读模式
- 一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
- mark()与reset():调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后调用Buffer.reset()方法恢复到这个position。
- equals():有相同的类型(byte、char、int等);Buffer中剩余的byte、char等的个数相等; Buffer中所有剩余的byte、char等都相同;以上三个条件都相等,两个Buffer相等
- compareTo():第一个不相等的元素小于另一个Buffer中对应的元素或者所有元素都相等,第一个Buffer的元素个数比另一个少,则Buffer小于另一个Buffer