如何使用Java的ByteBuffer.arrayOffset()方法

时间:2014-07-06 23:03:38

标签: java buffer nio

ByteBuffer.arrayOffset州的Java API文档:

  

返回此缓冲区的第一个元素(可选操作)的后备数组中的偏移量。

我无法弄清楚如何让arrayOffset()返回非零值。有谁知道如何更改调用ByteBuffer.arrayOffset()方法的结果?

5 个答案:

答案 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()方法返回的值来从实际数据中排除未使用的字节。