如何在没有 byteBuffer.array() 的情况下将一个 byteBuffer 部分复制到另一个 byteBuffer
How to copy partially one byteBuffer to another one without byteBuffer.array()
我有一个空字节缓冲区分配为
data = ByteBuffer.allocateDirect(layerSize(0, faces - 1, 0, levels - 1) * layers);
在this answer之后,我尝试使用array()
方法如下
public void setData(ByteBuffer data, int layer, int face, int level) {
int offset = offset(layer, face, level);
int levelSize = levelSize(level);
this.data.put(data.array(), offset, levelSize);
}
但我得到:
Caused by: java.lang.UnsupportedOperationException
at java.nio.ByteBuffer.array(ByteBuffer.java:994)
我尝试使用的源字节缓冲区是这样读取的:
File file = new File(Load.class.getResource(fileName).getFile());
FileInputStream fileInputStream = new FileInputStream(file);
FileChannel fileChannel = fileInputStream.getChannel();
return loadKtx(fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) file.length()));
public static Texture loadKtx(ByteBuffer byteBuffer) throws IOException {
...
byteBuffer.position(offset);
byteBuffer.limit(offset + faceSize);
ByteBuffer data = byteBuffer.slice();
texture.setData(data, layer, face, level);
byteBuffer.position(0);
byteBuffer.limit(byteBuffer.capacity());
有没有比简单的更好的选择
for (int b = 0; b < levelSize; b++) {
this.data.put(offset + b, data.get(b));
}
?
但是,整个项目 here 供感兴趣的人使用。
您是否只是想将一个 ByteBuffer
的一部分复制到另一个?如果是这样,你应该 duplicate()
你想要复制的 ByteBuffer
,将复制缓冲区的 position
和 limit
设置为你想要复制的范围,然后使用put()
。喜欢:
ByteBuffer src = data.duplicate();
src.position(offset);
src.limit(offset + levelSize);
dest.put(src);
很遗憾,好像没有。
感谢@Stefen C
我正在这样做:
ByteBuffer src = //...
byte[] remaining = new byte[src.capacity() - src.position() /*or offset */];
src.get(remaining);
ByteBuffer dest = ByteBuffer.wrap(remaining);
我有一个空字节缓冲区分配为
data = ByteBuffer.allocateDirect(layerSize(0, faces - 1, 0, levels - 1) * layers);
在this answer之后,我尝试使用array()
方法如下
public void setData(ByteBuffer data, int layer, int face, int level) {
int offset = offset(layer, face, level);
int levelSize = levelSize(level);
this.data.put(data.array(), offset, levelSize);
}
但我得到:
Caused by: java.lang.UnsupportedOperationException
at java.nio.ByteBuffer.array(ByteBuffer.java:994)
我尝试使用的源字节缓冲区是这样读取的:
File file = new File(Load.class.getResource(fileName).getFile());
FileInputStream fileInputStream = new FileInputStream(file);
FileChannel fileChannel = fileInputStream.getChannel();
return loadKtx(fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) file.length()));
public static Texture loadKtx(ByteBuffer byteBuffer) throws IOException {
...
byteBuffer.position(offset);
byteBuffer.limit(offset + faceSize);
ByteBuffer data = byteBuffer.slice();
texture.setData(data, layer, face, level);
byteBuffer.position(0);
byteBuffer.limit(byteBuffer.capacity());
有没有比简单的更好的选择
for (int b = 0; b < levelSize; b++) {
this.data.put(offset + b, data.get(b));
}
?
但是,整个项目 here 供感兴趣的人使用。
您是否只是想将一个 ByteBuffer
的一部分复制到另一个?如果是这样,你应该 duplicate()
你想要复制的 ByteBuffer
,将复制缓冲区的 position
和 limit
设置为你想要复制的范围,然后使用put()
。喜欢:
ByteBuffer src = data.duplicate();
src.position(offset);
src.limit(offset + levelSize);
dest.put(src);
很遗憾,好像没有。
感谢@Stefen C
我正在这样做:
ByteBuffer src = //...
byte[] remaining = new byte[src.capacity() - src.position() /*or offset */];
src.get(remaining);
ByteBuffer dest = ByteBuffer.wrap(remaining);