0
点赞
收藏
分享

微信扫一扫

简谈:NIO三大组件之Channel、Buffer

NIO释义:non-blocking io 的简写,即 非阻塞 IO

1. Channel

channel类似stream,但更加底层,是读写数据的双向通道,可将channel的数据写入buffer,也可将buffer的数据写入channel

常见的Channel:

FileChannel、DatagramChannel、

SocketChannel、ServerSocketChannel

2. Buffer

buffer用来缓冲读写数据,类似一个缓冲区

常见的buffer:

ByteBuffer(MapperByteBuffer、DirectByteBuffer、HeapByreBuffer)、

ShortBuffer、IntBuffer、LongBuffer、

FloatBuffer、DoubleBuffer、CharBuffer

我们主要了解一下ByteBuffer

2.1.结构:

2.1.1.重要属性:

capacity:容量

position:(写入/读取) 位置

limit:(写入/读取) 限制

简谈:NIO三大组件之Channel、Buffer_读取数据

简谈:NIO三大组件之Channel、Buffer_Channel_02

简谈:NIO三大组件之Channel、Buffer_读取数据_03

简谈:NIO三大组件之Channel、Buffer_NIO_04

简谈:NIO三大组件之Channel、Buffer_读取数据_05

简谈:NIO三大组件之Channel、Buffer_Buffer_06

2.1.2.向buffer写入数据的两种方式:

调用channel的read方法:

int readBytes = channel.read(buffer);

调用buffer自己的put方法

buffer.put(abc);

2.1.3从buffer读取数据的两种方式:

调用channel的write方法:

int writeBytes = channel.write(buffer);

调用buffer自己的get方法:

byte b = buffer.get();

注意:get方法会让position读指针往后走,如果想要重复读取数据

调用rewind方法将position重置为0

调用get(index)方法(index为整数),获取索引index的内容,该方法不会移动读指针

2.2使用方式:

1、向buffer写入数据,例如调用channel.read(buffer),该方法表示从channel中读取数据并写入到buffer中。(注意:此时我们要站在buffer的角度

2、调用flip( )从写模式切换至读模式

3、从buffer读取数据,例如调用buffer.get( )。

4、调用clear( )方法或者compact( )方法。

clear( )方法:position被设回0,limit被设置成 capacity的值。

compact( )方法:将所有未读的数据拷贝到Buffer起始处,然后将position设到最后一个未读元素后面。limit属性设置成capacity的值

重复步骤1~4


举报

相关推荐

0 条评论