Java 如何从ByteBuffer获取数组,但仅限于其位置?

Java 如何从ByteBuffer获取数组,但仅限于其位置?,java,arrays,bytebuffer,Java,Arrays,Bytebuffer,我有 然后我使用buf.putbyte几次,比如说20。 我通过底层数组(即调用buf.array)将其保存到sql blob。但是,buf.array的长度是500。如何获取可以传递给其他只读函数的长度为20的数组字节[]?当然,不要复制。试试这个 ByteBuffer buf = ByteBuffer.allocateDirect(500); 试试这个 ByteBuffer buf = ByteBuffer.allocateDirect(500); 为了确保我理解这一点,这里的a只是原始

我有

然后我使用buf.putbyte几次,比如说20。 我通过底层数组(即调用buf.array)将其保存到sql blob。但是,buf.array的长度是500。如何获取可以传递给其他只读函数的长度为20的数组字节[]?当然,不要复制。

试试这个

ByteBuffer buf = ByteBuffer.allocateDirect(500);
试试这个

ByteBuffer buf = ByteBuffer.allocateDirect(500);

为了确保我理解这一点,这里的a只是原始缓冲区的一个视图吗?i、 e.新字节[buf.position]和buf.geta是否都是O1操作且未执行复制?这是一个复制操作,但没有其他解决方案TRUE。如果您有一个缓冲区,并且希望创建一个数组,那么新数组必须从缓冲区复制其内容,因为您无法将缓冲区转换为数组。您可以使用:字节缓冲区可以是直接的,也可以是非直接的。给定一个直接字节缓冲区,Java虚拟机将尽最大努力直接在其上执行本机I/O操作。也就是说,在每次调用一个底层操作系统的本机I/O操作之前或之后,它都会尝试避免将缓冲区的内容复制到中间缓冲区或从中间缓冲区复制内容。@EvgeniyDorofeev好的,那么应该可以了,谢谢。还需要在行之间调用buf.position0 byte[]a=new。。。和buf.geta;从一开始就得到它。只是为了确保我理解这一点,这里是一个原始缓冲区的视图吗?i、 e.新字节[buf.position]和buf.geta是否都是O1操作且未执行复制?这是一个复制操作,但没有其他解决方案TRUE。如果您有一个缓冲区,并且希望创建一个数组,那么新数组必须从缓冲区复制其内容,因为您无法将缓冲区转换为数组。您可以使用:字节缓冲区可以是直接的,也可以是非直接的。给定一个直接字节缓冲区,Java虚拟机将尽最大努力直接在其上执行本机I/O操作。也就是说,在每次调用一个底层操作系统的本机I/O操作之前或之后,它都会尝试避免将缓冲区的内容复制到中间缓冲区或从中间缓冲区复制内容。@EvgeniyDorofeev好的,那么应该可以了,谢谢。还需要在行之间调用buf.position0 byte[]a=new。。。和buf.geta;从一开始就获取。您想从容量为500的缓冲区中获取长度为500的字节数组中获取长度为20的字节数组,还是不关心如何获取?不关心如何获取。只需要基本buf数组的前20个字节,以长度为20的字节数组的形式。因为在现实生活中,20更像是200000,我宁愿不做任何拷贝。但是,即使它有一个数组,您通常也无法在Java中获得数组的一部分。因此,没有拷贝就无法做到这一点。如果您有可能更改接收方法,可以给它一个bytebuffer.slice,它是字节缓冲区一部分的视图,即当前位置和限制之间的部分,您可以在调用slice之前相应地设置它,或者,让它接收完整的字节[],一个int位置和一个int长度,这是经常做的。你想从一个容量为500的缓冲区中的一个长度为500的字节数组中得到长度为20的字节数组,还是不关心如何得到?不关心如何得到。只需要基本buf数组的前20个字节,以长度为20的字节数组的形式。因为在现实生活中,20更像是200000,我宁愿不做任何拷贝。但是,即使它有一个数组,您通常也无法在Java中获得数组的一部分。因此,没有拷贝就无法做到这一点。如果您有可能更改接收方法,可以给它一个bytebuffer.slice,它是字节缓冲区一部分的视图,即当前位置和限制之间的部分,您可以在调用slice之前相应地设置它,或者,让它接收完整的字节[],一个int位置和一个int长度,这是经常做的