我一直在使用字节缓冲区,但很少使用切片。但是现在我们slice()在 on 上遇到了一个大问题bytebuffer。
请看下面的代码:
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())));
}
}
Run Code Online (Sandbox Code Playgroud)
它导致
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]
Run Code Online (Sandbox Code Playgroud)
请参阅上述结果中的 slc: value。我希望像[51, 52, 53].
如果我错了,请纠正我。它是java中的错误吗?
我在 java 7 , 8 中对此进行了测试
要添加到 m.antkowicz 答案中,位置确实是0,但是由于offset切片的属性(您可以使用 访问buff.arrayOffset()),使用:
sliced.get(0);
Run Code Online (Sandbox Code Playgroud)
会给你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();
}
Run Code Online (Sandbox Code Playgroud)
它会打印:
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
Run Code Online (Sandbox Code Playgroud)
要继续使用Arrays.asList,请将和属性添加offset到:positionlimit
int offset = buff.arrayOffset();
Arrays.copyOfRange(buff.array(), buff.position() + offset, buff.limit() + offset)
Run Code Online (Sandbox Code Playgroud)
回想一下,在幕后, aslice与原始缓冲区共享相同的底层数组。仅offset更改属性,以便您可以使用不同位置访问缓冲区的子部分。
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |