Java ByteBuffer视图

Java ByteBuffer视图,java,nio,Java,Nio,您知道java.nio.ByteBuffer的任何实现都会包装一个ByteBuffer实例数组,使它们看起来像单个实例,而不将字节复制到新的缓冲区中吗?java.nio中不存在任何实现,但几乎所有通道都实现了通过Techannel收集和通过Techannel分散,它们可以直接读写字节缓冲数组 : long write(ByteBuffer[]srcs) 从给定缓冲区将字节序列写入此通道 以及: 长read(ByteBuffer[]dsts) 将字节序列从此通道读入给定的缓冲区 上述方法也有部分版

您知道java.nio.ByteBuffer的任何实现都会包装一个ByteBuffer实例数组,使它们看起来像单个实例,而不将字节复制到新的缓冲区中吗?

java.nio中不存在任何实现,但几乎所有通道都实现了
通过Techannel收集
通过Techannel分散
,它们可以直接读写字节缓冲数组

:

long write(ByteBuffer[]srcs)

从给定缓冲区将字节序列写入此通道

以及:

read(ByteBuffer[]dsts)

将字节序列从此通道读入给定的缓冲区

上述方法也有部分版本,请参见上面的链接


NIO的要点是尽可能降低开销,这种方法(与使用单独的对象包装缓冲区相反)不会比简单数组产生更多的开销。我认为您的是这个及其实现的预期用例。

java.nio中不存在任何实现,但几乎所有通道都实现了
GatheringByteChannel
ScatteringByteChannel
,它们可以直接读写ByteBuffers数组

:

long write(ByteBuffer[]srcs)

从给定缓冲区将字节序列写入此通道

以及:

read(ByteBuffer[]dsts)

将字节序列从此通道读入给定的缓冲区

上述方法也有部分版本,请参见上面的链接


NIO的要点是尽可能降低开销,这种方法(与使用单独的对象包装缓冲区相反)不会比简单数组产生更多的开销。我认为您的应用程序就是这个应用程序及其实现的预期用例。

标准Java API中没有一个。 Grizzly NIO框架有一个CompositeBuffer,但is使用它自己的缓冲区作为包装器:

import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.memory.BuffersBuffer;
import org.glassfish.grizzly.memory.CompositeBuffer;    

....

ByteBuffer byteBuffer = ....;
HeapMemoryManager mm = new HeapMemoryManager();
CompositeBuffer buffer = BuffersBuffer.create();
Buffer b = mm.wrap(byteBuffer);
buffer.append(b);

标准javaapi中没有一个。 Grizzly NIO框架有一个CompositeBuffer,但is使用它自己的缓冲区作为包装器:

import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.memory.BuffersBuffer;
import org.glassfish.grizzly.memory.CompositeBuffer;    

....

ByteBuffer byteBuffer = ....;
HeapMemoryManager mm = new HeapMemoryManager();
CompositeBuffer buffer = BuffersBuffer.create();
Buffer b = mm.wrap(byteBuffer);
buffer.append(b);

ByteBuffer
Buffer
)大小固定。不可能做出类似“串联”的东西。您真正想做什么?我正在优化一些依赖于ByteBuffers的低级代码,最好减少出现的字节拷贝数。自然地,在字节缓冲区之间复制字节很简单,但正如nio框架所发现的那样;对大量字节反复这样做确实会积累起来。为什么不立即创建一个大的
ByteBuffer
?或者只使用数组。
ByteBuffer
Buffer
)的大小是固定的。不可能做出类似“串联”的东西。您真正想做什么?我正在优化一些依赖于ByteBuffers的低级代码,最好减少出现的字节拷贝数。自然地,在字节缓冲区之间复制字节很简单,但正如nio框架所发现的那样;对大量字节反复这样做确实会积累起来。为什么不立即创建一个大的
ByteBuffer
?我所知道的最近的一个类是Netty中名为Bytes的类,遗憾的是它们没有扩展ByteBuffer来实现它。Channel对我来说是一个错误的类,我想通过一个需要ByteBuffer(而不是Channel)的库来传递它。我已经通过复制字节解决了这个问题,但是由于大量字节将流经这个系统,所以发生的字节复制越少越好。不过,感谢您的想法。为什么不扩展库并扩展方法,以允许使用一个
ByteBuffer
s数组,而不仅仅是一个
ByteBuffer
?我猜正在读和写的底层
通道将支持上述操作,您不需要更改几行就可以使其正常工作。这是一个有趣的想法,谢谢。我没有考虑过。我的直觉是这样做需要更多的时间,而不仅仅是我自己。但我会扣住它,看看它会引向何方。如果他们真的有你所期望的底层代码,那么我可能会很幸运。我所知道的最接近的是Netty中的一个名为Bytes的类,遗憾的是他们没有扩展ByteBuffer来实现它。Channel对我来说是一个错误的类,我想通过一个需要ByteBuffer(而不是Channel)的库来传递它。我已经通过复制字节解决了这个问题,但是由于大量字节将流经这个系统,所以发生的字节复制越少越好。不过,感谢您的想法。为什么不扩展库并扩展方法,以允许使用一个
ByteBuffer
s数组,而不仅仅是一个
ByteBuffer
?我猜正在读和写的底层
通道将支持上述操作,您不需要更改几行就可以使其正常工作。这是一个有趣的想法,谢谢。我没有考虑过。我的直觉是这样做需要更多的时间,而不仅仅是我自己。但我会扣住它,看看它会引向何方。如果它们确实像您所期望的那样有底层代码,那么我可能会很幸运。