2014-09-10 36 views
1

所以我读了一些文章,但基本上,因为我想要一个快速的I/O,我想写一个双数组到文件。要做到这一点,我需要将其转换为字节数组。不幸的是,这使得数据的复制。java不安全,如何将内存解释为其他类型的对象?

所以我想知道起诉java不安全是否有可能使一个byte []变量指向double []数组的地址,只是将数据解释为字节而不是双精度? 我到目前为止没有找到任何地方这样的例子,只有如何使用复制内存才能做到这一点。任何意见都表示赞赏!

+4

您可以使用[ByteBuffer#asDoubleBuffer](http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#asDoubleBuffer())。这使您可以使用实际更改基础ByteBuffer的DoubleBuffer。 – maba 2014-09-10 21:16:23

+1

本文看起来像是在做你想做的事情。 http://java-performance.info/object-assignments-type-conversions-on-the-low-level-in-java/ – resueman 2014-09-10 21:18:30

+0

如果你想要可移植性(32/64位),那么我会使用Java NIO。使用FileChannel,ByteBuffer(可以是直接字节缓冲区)和DoubleBuffer。 – maba 2014-09-10 21:22:05

回答

4

如果你从一个ByteBuffer开始,你可以保存它的引用并且可以互换使用它们。

ByteBuffer bb = ByteBuffer.allocateDirect(8 * n_doubles); 
DoubleBuffer db = bb.asDoubleBuffer(); 

不能读/写要么并查看它作为byte S或double S作为相同的存储器被使用。

如果您想避免将其他副本添加到文件中,可以使用内存映射区域。

顺便说一句:ByteBuffer使用不安全,但以一种方式保护你。

+0

唯一的问题是,这可能会遇到的问题是,如果您不负责生成double []数组的代码,例如当您使用其他库代码时...比您无法更改该代码。 在我看来,这是一个解决方案,可能更好。但我仍然喜欢@resueman指出的,这表明了不安全的力量。开心:) – 2014-09-10 22:17:14

+0

@Belov你可以访问double [],就好像它是一个字节[],但它实际上不会是一个字节[]或者在一个ByteBuffer中。你可以做一个原始的内存拷贝,以减少工作,但它仍然是一个副本。 – 2014-09-10 23:24:29

+1

在我的情况下,我不能,因为我会再次使用double []作为双数组,但是如果您只需要存储它,而不再次访问数组,那么比如果您查看发布在文章中的文章只有通过更改原始内存中保存的偏移量的类型和长度标题,才能将double []数组转换为byte []。是一个有趣的练习,至少对我来说:)。 – 2014-09-14 19:48:41

相关问题