我们可以直接将对象读入java中的bytebuffer吗?

时间:2014-04-12 21:22:46

标签: java bytebuffer

假设我有一个List<Integer> ls并且我知道它的长度我们可以为bytebuffer分配长度* 4个字节并使用put到directlty read ls到缓冲区吗?

1 个答案:

答案 0 :(得分:1)

这应该做你正在寻找的事情:

ByteBuffer buffer = ByteBuffer.allocate(ls.size()*4);
for (Integer i: ls)
    buffer.putInt(i);

一个警告:此函数假定您的列表不包含任何 null 条目。

我认为你可以做得比这更好,因为Integerls对象的基础数组是这些Integer的引用数组(指针)对象而不是它们包含的int - 值。实际的Integer对象将以某种随机顺序驻留在内存中,大致由创建时间决定。因此,您不太可能找到一些连续的内存块,其中包含您需要复制到ByteBuffer的数据(我认为这就是您的意思&#34;直接阅读&# 34;它。)。因此,使用sun.misc.Unsafe之类的东西可能无法帮助您。

即使你有一个int[]而不是List<Integers>,你可能也无法直接从内存中可靠地读取数据到ByteBuffer,因为有些JVM&# 39; 64位计算机将在64位地址位置上对齐所有值以便更快地访问,这将导致&#34;间隙&#34;在ints之间。然后是endianness的问题,这可能因平台而异......

编辑:

嗯...我刚刚看了一下这将要调用的OpenJDK source-code for the putInt()-function ......这是一个可怕的子功能调用。如果&#34; sun&#34; -implementation为&#34; bad&#34;,如果您正在寻找,您可能最好自己进行转换(使用移位和二进制操作)性能...最快的可能是将Integers转换为byte[],然后使用ByteBuffer.wrap(...),如果您需要答案为ByteBuffer。如果您需要代码,请告诉我......

相关问题