如何使用Java';s ByteBuffer.arrayOffset()方法
针对以下状态的Java API文档: 返回缓冲区第一个元素在此缓冲区的备份数组中的偏移量(可选操作) 我不知道如何获取如何使用Java';s ByteBuffer.arrayOffset()方法,java,buffer,nio,Java,Buffer,Nio,针对以下状态的Java API文档: 返回缓冲区第一个元素在此缓冲区的备份数组中的偏移量(可选操作) 我不知道如何获取arrayOffset()以返回非零值。是否有人知道如何更改对ByteBuffer.arrayOffset()方法的调用结果?已更新,以描述使用由ByteBuffer支持的数组切片 数组偏移量指向备份缓冲区中的偏移量。获取0以外的值的方法之一是创建一个由teBuffer支持的数组,然后调用。切片的结果将具有与原始ByteBuffer的当前位置相对应的偏移值。 阵列偏移量仅在与直接
arrayOffset()
以返回非零值。是否有人知道如何更改对ByteBuffer.arrayOffset()
方法的调用结果?已更新,以描述使用由ByteBuffer支持的数组切片
数组偏移量指向备份缓冲区中的偏移量。获取0以外的值的方法之一是创建一个由teBuffer支持的数组,然后调用。切片的结果将具有与原始ByteBuffer的当前位置相对应的偏移值。
阵列偏移量仅在与直接交互时有用。我假定您使用的是以下(或类似)文档: 我刚刚对此进行了实验,似乎基类的偏移量始终为零:
java.nio.ByteBuffer bb = java.nio.ByteBuffer.wrap("The dog chased the cat".getBytes());
System.out.println("offset test: " + bb.arrayOffset());
bb.putChar(5, 'Z');
System.out.println("offset test: " + bb.arrayOffset());
bb.getChar(5);
System.out.println("offset test: " + bb.arrayOffset());
请注意,java.nio.ByteBuffer是一个抽象类,我使用静态wrap方法创建了类java.nio.HeapByteBuffer的实例(文档在这里)
ByteBuffer的文档说arrayOffset的实现是可选的,非实现者的默认值可能总是零
如果有疑问,请获取Java标准库的源代码,以便在IntelliJ或Eclipse等IDE中浏览。ByteBuffer.wrap()通过调用其构造函数返回HeapByteBuffer:
HeapByteBuffer(byte[] buf, int off, int len) { // package-private
super(-1, off, off + len, buf.length, buf, 0);
/*
hb = buf;
offset = 0;
*/
}
super()的最后一个参数是arrayOffset()返回的值。所以,永远是零 当调用put或get方法时,ByteBuffer在后台字节数组中计算索引时,arrayOffset显然被ByteBuffer使用。在堆上分配的数组(包装数组)上,它可能始终为零。对于allocateDirect()的某些实现,这并不总是正确的
public ByteBuffer slice() {
return new HeapByteBuffer(hb,
-1,
0,
this.remaining(),
this.remaining(),
this.position() + offset);
}
ByteBuffer byteBuffer = ByteBuffer.allocate(32);
byteBuffer.putChar('A');
ByteBuffer sliceByteBuffer = byteBuffer.slice();
print("arrayOffset = "+ sliceByteBuffer.arrayOffset());//arrayOffset = 2
在Zebra Android MC33上,使用allocateDirect()实现ByteBuffer可以具有非零偏移量。例如,arrayOffset()方法的返回值为4意味着放置位置(0)实际上正在更新直接数组中的第5个字节。数组的前4个字节未被访问,但它们是后台数组的内部部分,在调用array()方法时返回
当使用FileOutputStream之类的类并传递ByteBuffer数组()时,arrayOffset()方法返回的值是从实际数据中排除未使用的字节所必需的 你能给我们看看你的密码吗?你得到了什么样的错误?这根本不是真的,这很容易检查。这个答案在@LubosD的评论中被修改过,现在包含了事实上准确的信息+1.虽然此代码可能会回答此问题,但提供有关其解决问题的方式和原因的信息会提高其长期价值,因为此答案假设
ByteBuffer。wrap
是调用HeapByteBuffer
构造函数的唯一方法。通过检查HeapByteBuffer
类的源代码,可以验证slice()
方法是否更改了arrayOffset()
方法返回的值。