2017-07-17 84 views
0

那麼將它複製如何訪問一個原始陣列的一部分,我知道有兩個類似的問題,但我的是不同的:不需要在Java

如何獲得基本數組的子集,而不復制呢?

爲什麼? 我必須閱讀許多大型「文件」(約20M)通過標準輸入讀取。這些文件內嵌有JPG文件。這些JPG文件用於一些計算。我需要保留原始文件,而我使用嵌入式JPG來決定保留原始文件。

爲此我想獲得字節數組(原始文件)的子集(JPG)。我想用第三方庫(OpenCV)使用這個子集數組。

最接近的解決方案是:Arrays.asList(array).subList(x,y)。 但是這個解決方案不適用於原始數組。我試圖通過不復制數組而不使用包裝類來提高性能。

真的沒有辦法抓取原始數組的子集嗎? (數組,位置,長度).toArray()返回原始完整字節數組。


編輯:對不起,忘記告訴你,我從設備而不是磁盤獲取這些文件。因此,我需要首先將整個事件記錄到記憶中。然後決定將它保存在磁盤上或不。

+0

番石榴有'Ints.asList()'(對於其他原始類型相同)。 – shmosel

+1

爲什麼要將整個文件首先讀入內存?只讀/跳到JPG部分,閱讀,然後做出您的決定。 – EJP

+0

正如我所提到的,我需要決定保留基於JPG的一些屬性的整個事情。字節數組來自一個設備。我不想保存在磁盤上以減少磁盤上的IO負擔,因爲我將處理很多這樣的文件。也許是1000年。 – Genom

回答

0

當您在Java中傳遞數組引用(講述HotSpot JVM)時,您將引用傳遞給必須具有特定佈局的內存區域:對象頭,數組長度,然後是數組內容。你應該以某種方式將標題和長度放在較小的JPG數組的開始位置,從而「破壞」更大的陣列。總而言之,我認爲,這可以通過使用sun.misc.Unsafe或JNI,瞭解您的JVM的詳細信息(32位或64位,壓縮哎呀或不壓縮),運氣好,這樣就不會在GC中出現,保存並恢復「損壞的」字節,但它非常脆弱並容易出錯。

+0

我看了一下JNI,有幾個消息來源聲稱只有通過可用的方法才需要通過JNI訪問Java數組。我簡要介紹了可用的方法,但我沒有找到一種方法來用自定義字段「創建」數組對象。 sun.misc.Unsafe被認爲會被Java 9刪除,因此非常不鼓勵。然而,許多圖書館使用它來獲得更好的性能。 sun.misc.Unsafe實際上可以達到所有這些領域。這是一個不安全的分析:https://stackoverflow.com/questions/13780350/is-there-any-way-to-create-a-primitive-array-without-initialization/13785284#13785284 – Genom