ByteBuffer.arrayOffset州的Java API文档:
返回此缓冲区的第一个元素(可选操作)的后备数组中的偏移量。
我无法弄清楚如何让arrayOffset()
返回非零值。有谁知道如何更改调用ByteBuffer.arrayOffset()
方法的结果?
答案 0 :(得分:2)
更新以描述在阵列支持的ByteBuffer上使用slice。
数组偏移量指向后备缓冲区中的偏移量。获取0以外的值的方法之一是创建一个支持ByteBuffer的数组,然后调用slice。 slice的结果将具有与原始ByteBuffer的当前位置对应的偏移值。 仅当getting the backing array与
直接交互时,数组偏移才有用答案 1 :(得分:2)
我假设您使用的是此(或类似)文档:http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html
我刚试过这个,看起来基类的偏移量总是为零:
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类的实例(文档在这里http://www.docjar.org/docs/api/java/nio/HeapByteBuffer.html)
ByteBuffer的文档说arrayOffset的实现是可选的,非实现者的默认值可能总是为零。
如有疑问,请获取Java标准库的源代码,以便在IntelliJ或Eclipse等IDE中进行浏览。
答案 2 :(得分:1)
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
答案 3 :(得分:0)
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()返回的。所以,永远为零!
答案 4 :(得分:0)
当调用put或get方法时,ByteBuffer显然在计算出后台字节数组的索引时使用ArrayBuffer。在堆上分配的数组(包装的数组)上,它可能始终为零。对于allocateDirect()的某些实现并非总是如此。
在Zebra Android MC33上,使用allocateDirect()的ByteBuffer实现可以具有非零偏移量。例如,从arrayOffset()方法返回的值为4意味着放置到position(0)确实在更新直接数组中的第5个字节。数组的前4个字节未被访问,但在后台数组内部,并且在调用array()方法时返回。
在使用FileOutputStream之类的类并传递ByteBuffer array()时,必须使用arrayOffset()方法返回的值来从实际数据中排除未使用的字节。