是否有任何方法可以通过Java API,某些现有库或某些Kotlin stdlib或Kotlin库获取显示另一个ByteBuffer
子视图的NIO ByteBuffer
?
例如,假设我有一个名为ByteBuffer
的1024个元素bb1
,我要查看其视图bb2
,该视图仅包含bb1
的后半部分。即bb2
的元素0对应于bbq
的元素512,并且bb2
的容量为512。bb2
应该不能访问bb1
的前半部分,并且客户端代码应该能够使用bb2
就像是完全独立的ByteBuffer
,容量为512,而不是知道它是较大ByteBuffer
的子视图。
我也接受使用kotlinx-io IoBuffer
进行此操作的某种方式。
谢谢。
如果您使用的是Java 13+,则可以使用ByteBuffer#slice(int,int)
:
创建一个新的字节缓冲区,其内容是该缓冲区内容的共享子序列。
新缓冲区的内容将从此缓冲区的位置
ByteBuffer#slice(int,int)
开始,并将包含index
元素。对该缓冲区内容的更改将在新缓冲区中可见,反之亦然;这两个缓冲区的位置,限制和标记值将是独立的。新缓冲区的位置将为零,其容量和限制将为
length
,其标记将是未定义的,其字节顺序将为length
。当且仅当该缓冲区是直接缓冲区时,新缓冲区才是直接缓冲区;当且仅当该缓冲区是只读缓冲区时,新缓冲区才是只读缓冲区。
如果您使用的是Java的较旧版本,或者希望根据原始缓冲区的位置和限制进行切片,则可以使用BIG_ENDIAN
:
创建一个新的字节缓冲区,其内容是该缓冲区内容的共享子序列。
新缓冲区的内容将从该缓冲区的当前位置开始。对该缓冲区内容的更改将在新缓冲区中可见,反之亦然;这两个缓冲区的位置,限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将是此缓冲区中剩余的字节数,其标记将是未定义的,其字节顺序将为
ByteBuffer#slice()
。当且仅当该缓冲区是直接缓冲区时,新缓冲区才是直接缓冲区;当且仅当该缓冲区是只读缓冲区时,新缓冲区才是只读缓冲区。