2014-09-10 41 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

相關問題