java bytebuffer slice 不按照文档工作

标签 java bytebuffer

我已经使用字节缓冲区很长时间了,但很少使用切片。但是现在 bytebuffer 上的 slice() 有一个大问题。

请看下面的代码:

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Arrays;

public class Test12 {

    public static void main(String[] args) throws UnsupportedEncodingException {

        ByteBuffer original = ByteBuffer.wrap("234567".getBytes("UTF-8"));
        printBuffer("org: ",original);

        original.position(1);
        original.limit(original.limit()-2);

        printBuffer("org: ",original);


        ByteBuffer sliced =  original.slice();
        printBuffer("slc: ",sliced);

        ByteBuffer duplicated =  original.duplicate();
        printBuffer("dup: ",duplicated);

        ByteBuffer compact =  original.compact();
        printBuffer("cmp: ",compact); 
    }


    private static  void printBuffer(String prefix,ByteBuffer buff) 
    {
        System.out.println(prefix+buff);
        System.out.println(prefix+Arrays.toString(Arrays.copyOfRange(buff.array(), buff.position(), buff.limit())));

    }

}

结果是

org: java.nio.HeapByteBuffer[pos=0 lim=6 cap=6]
org: [50, 51, 52, 53, 54, 55]
org: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6]
org: [51, 52, 53]
slc: java.nio.HeapByteBuffer[pos=0 lim=3 cap=3]
slc: [50, 51, 52]
dup: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6]
dup: [51, 52, 53]
cmp: java.nio.HeapByteBuffer[pos=3 lim=6 cap=6]
cmp: [53, 54, 55]

请看上面结果中的slc:value。我希望得到类似 [51, 52, 53] 的结果。

如果我错了请纠正我。 它是 Java 中的 Bug 吗?

我在 java 7 和 8 中测试过这个

最佳答案

添加到 m.antkowicz 答案中,位置确实是 0,但是由于切片的 offset 属性(您可以使用 buff 访问它.arrayOffset()),使用:

sliced.get(0);

会给你 51。要打印可视化,请将 printBuffer 方法更改为:

private static void printBuffer(String prefix, ByteBuffer buff) {
    System.out.println(prefix + buff);
    System.out.print(prefix);
    for (int i = buff.position(); i < buff.limit(); i++) {
        System.out.print(" " + buff.get(i));
    }
    System.out.println();
}

它将打印:

org: java.nio.HeapByteBuffer[pos=0 lim=6 cap=6]
org:  50 51 52 53 54 55
org: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6]
org:  51 52 53
slc: java.nio.HeapByteBuffer[pos=0 lim=3 cap=3]
slc:  51 52 53
dup: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6]
dup:  51 52 53
cmp: java.nio.HeapByteBuffer[pos=3 lim=6 cap=6]
cmp:  53 54 55

要继续使用 Arrays.asList,请将 offset 添加到 positionlimit 属性:

int offset = buff.arrayOffset();
Arrays.copyOfRange(buff.array(), buff.position() + offset, buff.limit() + offset)

回想一下,在幕后,slice 与原始缓冲区共享相同的底层数组。仅更改了 offset 属性,以便您可以使用不同的位置访问缓冲区的子部分。

关于java bytebuffer slice 不按照文档工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43273479/

相关文章:

java - 当为映射文件打开 FileOutputStream 时从 java.nio.MappedByteBuffer 读取会导致 "unsafe memory access"错误

java - 如何将 MySQL 表的列的值检索到代码中?

java - ArrayList 矩形

java - 在java中将两个字节转换为有符号整数

java - java中如何处理字节序列?

java - FileChannel 和 ByteBuffer 写入额外数据

java - 使用 html 字符串生成 PDF

JAVA:BigO 算法 - equalsIgnoreCase 和 CompareTo

java - 如何使用数据库单元初始化数据库(语句中未找到表)?

Java ArrayList<primitive datatype> 连续内存分配仅用于引用?