java-nio-缓冲区ByteBuffer、Netty的ByteBuf和MappedByteBuffer的使用
文章目录
环境
idea2018,jdk1.8
记录一下缓冲区ByteBuffer、Netty的ByteBuf和MappedByteBuffer的使用笔记,参考文献:
ByteBuffer:《Java NIO》
Netty的ByteBuf:https://www.cnblogs.com/duanxz/p/3724448.html
MappedByteBuffer:https://www.cnblogs.com/ironPhoenix/p/4204472.html
1.ByteBuffer
1)ByteBuffer
mark的作用:
为某一读过的位置做标记,便于某些时候回退到该位置。
2)ByteBuffer directBuffer=ByteBuffer.allocateDirect(10);
直接内存的读写操作比普通Buffer快,但它的创建、销毁比普Buffer慢。因此直接内存使用于需要大内存空间且频繁访问的场合,不适用于频繁申请释放内存的场合
ByteBuffer使用示例:
public static void main(String[] args) throws Exception {
System.out.println("----------Test allocate--------");
//堆内内存是由JVM进程内存
ByteBuffer buffer = ByteBuffer.allocate(10240000);
System.out.println("buffer = " + buffer);
// 这部分直接用的系统内存,所以对JVM的内存没有影响
ByteBuffer directBuffer = ByteBuffer.allocateDirect(10240000);
System.out.println("directBuffer = " + directBuffer);
System.out.println("----------Test wrap--------");
byte[] bytes = new byte[32];
buffer = ByteBuffer.wrap(bytes);
System.out.println(buffer);
buffer = ByteBuffer.wrap(bytes, 10, 22);
System.out.println(buffer);
}
/**
* @Description: ByteBuffer的操作:
* 1)NIO ByteBuffer只有一个标识位置的指针position,读写的时候需要手工调用flip()和rewind()等方法
* 2)直接内存的读写操作比普通Buffer快,但它的创建、销毁比普通Buffer慢。
* 因此直接内存使用于需要大内存空间且频繁访问的场合,不适用于频繁申请释放内存的场合。
*/
public class TestByteBufferMethod {
public static ByteBuffer getByteBuffer(String str) {
return ByteBuffer.wrap(str.getBytes());
}
public static String getString(ByteBuffer buffer) {
buffer.flip();
Charset charset = null;
CharsetDecoder decoder = null;
CharBuffer charBuffer = null;
try {
charset = Charset.forName("UTF-8");
decoder = charset.newDecoder();
// charBuffer = decoder.decode(buffer);//用这个的话,只能输出来一次结果,第二次显示为空
charBuffer = decoder.decode(buffer.asReadOnlyBuffer());
return charBuffer.toString();
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
public static void main(String[] args) throws Exception {
System.out.println("--------Test reset----------");
ByteBuffer buffer = ByteBuffer.allocate(32);
//一般在把数据写入Buffer前调用
buffer.clear();
//设置position位置
buffer.position(5);
//调用mark()会将mark设为当前的position的值,以后调用reset()会将position属性设置为mark的值
buffer.mark();
buffer.position(10);
System.out.println("before reset:" + buffer);
buffer.reset();
System.out.println("after reset:" + buffer);
System.ou