2010-11-02 102 views
2

在我的Android應用程序中,我有一個Bitmap對象和一個int []。我的應用程序中的一種算法將位圖像素值複製到int [],然後修改後者中的值。快速寫入int []到磁盤?

我想盡快將原始int []的內容保存到磁盤。什麼是快速和高效的內存方式? (即調用每個int []項上的.writeInt函數在Android中執行此操作會非常緩慢,因爲在大多數設備上沒有JIT)

我發現如果我創建了一個字節[]與int []大小相同並將int []複製到byte [],然後我可以使用多個文件io方法之一在一次API調用中將byte []寫入磁盤。然而,這使用了很多額外的內存,因爲我現在有兩個版本的int []。

失敗了,也許有一些方法會直接將位圖的int值寫入文件中?如果是這樣,我可以將int []複製回Bitmap對象並使用它。順便說一句,我不想​​使用「.png」壓縮,只是想保存原始值,因爲後者更快。

回答

1

我想你將不得不分配一個緩衝區(byte[]),這個緩衝區的大小可以最大化性能,並且仍然只使用合理的內存量。也許像8K一樣。

然後,您在頁面(緩衝區大小/ 4)中遍歷數組,然後填充緩衝區並將其寫出。下一頁可以重用相同的緩衝區。確保你正確處理最後一頁,這可能是半空的(當然有位圖,它可能與8K緩衝區對齊)。

+1

您也可以嘗試ObjectOutputStream.writeObject(myIntArray)。也許它在本質上做了一些巧妙的事情。 – Thilo 2010-11-02 02:20:51

+0

謝謝,我會放棄這一點。我很驚訝於缺少writeIntArray函數。順便說一下,有沒有一種簡單的方法來查看如何爲數組實現writeObject?我不確定在哪裏看。這可能是一個好方法,但考慮到未來,這使得很難在不使用Java的情況下閱讀文件。 – RichardNewton 2010-11-02 02:28:55

+1

是的,如果它需要跨平臺(另一方面,它幾乎肯定只是一個頭,然後是整數序列),我不會使用writeObject。讓我知道你是否發現了原始數組的writeObject實現(在JDK或Android中)。 – Thilo 2010-11-02 02:31:29

1

我認爲你可以使用緩衝流的概念,只是將你的int []的部分轉換爲byte []並寫入,然後執行下一批。嘗試測試並確定一個對內存要求不高,但效率足夠高的緩衝區大小,我認爲幾個KB就足夠了。

0

最快的方法是創建一個使用C函數寫出來的NDK庫,然後將使用JNI的Int數組傳遞給C例程。

-niko

+0

這很難嗎?它適用於所有Android手機嗎? – RichardNewton 2010-11-03 01:01:13