Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java';s ByteBuffer.arrayOffset()方法_Java_Buffer_Nio - Fatal编程技术网

如何使用Java';s ByteBuffer.arrayOffset()方法

如何使用Java';s ByteBuffer.arrayOffset()方法,java,buffer,nio,Java,Buffer,Nio,针对以下状态的Java API文档: 返回缓冲区第一个元素在此缓冲区的备份数组中的偏移量(可选操作) 我不知道如何获取arrayOffset()以返回非零值。是否有人知道如何更改对ByteBuffer.arrayOffset()方法的调用结果?已更新,以描述使用由ByteBuffer支持的数组切片 数组偏移量指向备份缓冲区中的偏移量。获取0以外的值的方法之一是创建一个由teBuffer支持的数组,然后调用。切片的结果将具有与原始ByteBuffer的当前位置相对应的偏移值。 阵列偏移量仅在与直接

针对以下状态的Java API文档:

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

我不知道如何获取
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()
方法返回的值。