java不安全,如何将内存解释为其他类型的对象?

java不安全,如何将内存解释为其他类型的对象?,java,memory,unsafe,Java,Memory,Unsafe,所以我读了几篇文章,但本质上是因为我想要一个快速的I/O,所以我想给一个文件写一个双数组。为此,我需要将其转换为字节数组。不幸的是,这会导致数据的复制 所以我想知道起诉java是不安全的,有没有可能使一个byte[]变量指向double[]数组的地址,并将数据解释为字节而不是double? 到目前为止,我还没有找到这样的例子,只是再次说明了如何使用复制内存来实现这一点。任何建议都将不胜感激 如果你从一个ByteBuffer开始,你可以保留它的引用并交替使用它们 ByteBuffer bb = B

所以我读了几篇文章,但本质上是因为我想要一个快速的I/O,所以我想给一个文件写一个双数组。为此,我需要将其转换为字节数组。不幸的是,这会导致数据的复制

所以我想知道起诉java是不安全的,有没有可能使一个byte[]变量指向double[]数组的地址,并将数据解释为字节而不是double?
到目前为止,我还没有找到这样的例子,只是再次说明了如何使用复制内存来实现这一点。任何建议都将不胜感激

如果你从一个ByteBuffer开始,你可以保留它的引用并交替使用它们

ByteBuffer bb = ByteBuffer.allocateDirect(8 * n_doubles);
DoubleBuffer db = bb.asDoubleBuffer();
由于使用了相同的内存,您既不能读/写,也不能将其视为
字节
s,也不能将其视为
双字节
s

如果要避免向文件添加额外副本,可以使用内存映射区域


顺便说一句:ByteBuffer使用的是不安全的,但保护您的方式。

您可以使用。这使您可以使用DoubleBuffer,它实际上改变了底层的ByteBuffer。如果您想要可移植性(32/64位),那么我会选择JavaNIO。使用文件通道,ByteBuffer(可以是直接字节缓冲区)和DoubleBuffer。我想知道有没有一种方法可以从DoubleBuffer到ByteBuffer进行相反的转换,因为我不想改变使用doubles的底层实现?@resueman这正是我所寻找的,而且非常棒。谢谢。唯一的问题是,如果您不负责生成double[]数组的代码,例如当您使用其他库代码时。。。你不能改变这一点。就我而言,这是一个解决方案,可能更好。但我仍然喜欢@resueman所指的,它显示了不安全的力量。Happy:)@Belov您可以像访问byte[]一样访问double[],但实际上它不是byte[]或ByteBuffer。你可以做一个原始内存拷贝,以减少工作量,但它仍然是一个拷贝。在我的情况下,我不能,因为我以后会再次使用double[]作为双数组,但是如果你只需要存储它,而不需要再次访问数组,那么如果你查看resueman在我的问题评论中发表的文章,你可以转换double[]仅通过更改原始内存中保存的偏移量中类型和长度的标头,将数组转换为字节[]。至少对我来说,这是一个有趣的练习:)。