ByteBuffer是java.nio中最常用的缓冲区,它提供了读写其他数据类型的方法。然而查看API文档后发现,java.nio.ByteBuffer其实是一个抽象类,其中有许多的抽象方法,如asCharBuffer(),asIntBuffer()等.
有两类静态工厂方法用于创建ByteBuffer:ByteBuffer.allocate(int capacity)和ByteBuffer.wrap(byte[] array).
例如:
ByteBuffer buffer = ByteBuffer.allocate(1024);
这里有一个疑问,难道buffer真是ByteBuffer的实例?一个抽象类的实例?
首先要明确的是,抽象类是不可能被实例化的,抽象类具有不完整的类定义,所以不能产生一个完整的实例。那这里的buffer实例到底是怎么回事?
我们在该语句处打上断点,debug运行,进入allocate方法内部,看到ByteBuffer的源码
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}
注意这里的
new HeapByteBuffer(capacity, capacity)
继续进入HeapByteBuffer的定义,看到
class HeapByteBuffer extends ByteBuffer
所以我们找到了buffer对象的真正类型,这就是HeapByteBuffer,它是ByteBuffer的子类,我们以后使用buffer对象进行任何操作,实际上使用的是HeapByteBuffer对象,只不过HeapByteBuffer类不是public的,所以不是API的一部分,仅从API文档我们是无法知道它的存在的.
另外,在ByteBuffer类的文档中,我们可以看到ByteBuffer还有一个子类MappedByteBuffer,这个类是public的,因此我们能够发现并直接使用它,它和内存映射有关,在这里就不再讨论了.
分享到:
相关推荐
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
仿安卓ByteBuffer 完美组包、拆包
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( ...
Android
主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题
本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下: 一、ByteBuffer 定义 在NIO中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时...
【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip
protobuf+long+bytebuffer,利用protobuf.js实现编解码 所需的三个js库
易语言汇编版ByteBuffer源码。主要用于各种网络协议的组包 具体用法可以点上面的网址 功能和jAVA的一样。@10371178。Tags:易语言汇编版ByteBuffer源码。
易语言汇编版ByteBuffer源码主要用于各种网络协议的组包 具体用法可以点上面的网址 功能和jAVA的一样
java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现
dena-bytebuffer
jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯
NULL 博文链接:https://chinaestone.iteye.com/blog/468138
1.不能应付可变长类型的数据,比如STL中的那些容器,当然,STL的容器归根到底就是一个class,他们的长度都是不确定的; 2.内存对齐的问题,Windows默认的对齐是4字节,如果不去刻意关闭掉对齐的话,那么可能会多出...
使用BufferedInputStream字节流,以及StringBuiler技术实现字节的逐行读取。即字节流的readline功能。BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(file));
} 创建一个新实例并初始化数据MyData data = new MyData ();data . x = 12.3 ;data . y = 4.56 ;data . name = " Matej " ;data . numbers = new int [] { 1 , 2 , 8 }; 序列化到缓冲区ByteBuffer buffer = ...