Java NIO学习笔记之二-图解ByteBuffer
2016-07-22 10:12
369 查看
yteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。
《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。
值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。
这里插两个Channel方面的对象,以便更好的理解Buffer。
那么,一个ByteBuffer的使用过程是这样的:
看到这里,一般都不太明白flip()干了什么事,先从ByteBuffer结构说起:
mark相关的方法主要是
《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。
概述
ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而
DirectByteBuffer则使用了
unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。
使用
ByteBuffer最核心的方法是put(byte)和
get()。分别是往ByteBuffer里写一个字节,和读一个字节。
值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。
这里插两个Channel方面的对象,以便更好的理解Buffer。
ReadableByteChannel是一个从Channel中读取数据,并保存到ByteBuffer的接口,它包含一个方法:
1 | public int read(ByteBuffer dst) throws IOException; |
WritableByteChannel则是从ByteBuffer中读取数据,并输出到Channel的接口:
1 | public int write(ByteBuffer src) throws IOException; |
1 | byteBuffer = ByteBuffer.allocate(N); |
2 | //读取数据,写入byteBuffer |
3 | readableByteChannel.read(byteBuffer); |
4 | //变读为写 |
5 | byteBuffer.flip(); |
6 | //读取byteBuffer,写入数据 |
7 | writableByteChannel.write(byteBuffer); |
ByteBuffer内部字段
byte[] buff
buff即内部用于缓存的数组。position
当前读取的位置。mark
为某一读过的位置做标记,便于某些时候回退到该位置。capacity
初始化时候的容量。limit
读写的上限,limit<=capacity。图解
put
写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。flip
写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。get
从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。clear
将position置为0,并不清除buffer内容。mark相关的方法主要是
mark()(标记)和
reset()(回到标记),比较简单,就不画图了。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试