2011-12-29 103 views
1

我正在開發一個將數據寫入文件的應用程序。讓我們假設它正在寫入我們關閉電池的數據。該文件會發生什麼?它會被寫入一半(損壞),是空的還是與我們寫信之前一樣?我的猜測是它會被損壞。當文件存儲對象的數組列表時,如何檢查它是否損壞? java會拋出一個損壞的文件異常,或者說read arraylist爲null或者它是一個未知對象?如何在android中備份電池電量數據?

PS。也許創建另一個文件,將保持數據文件的MD5校驗和?而且,無論何時我首先寫入文件數據,我都會產生校驗和,然後當我從數據文件中讀取數據時會生成一個校驗和,並將其與前一個數據進行比較。這將表明我的數據是否完好無損,但不會讓我回滾到之前的狀態(預先損壞的狀態)。我想要一個儘可能輕量級的方法,我已經通過讀取/寫入一組數千個屬性變化的存儲更改來使用CPU。一個數據庫可能是一個更好的主意。

回答

3

我不能說Java如何讀取損壞的序列化數組,但爲了安全起見,我們假設沒有錯誤檢測。

在這種情況下,你有兩種簡單的方式:

  • 存儲數據的校驗你的數據結構裏面,你把它序列化之前。
  • 計算最終序列化文件的校驗和。

這兩種情況將同樣的方式工作,但因爲你計算校驗你寫的事情之前到磁盤(和爲此避免額外的一輪文件I/O)的第一選擇可能是有點快。

正如你所提到的,MD5會適合這個。 (即使是一個基本的CRC可能會很好 - 你不需要一個cryptograhpic散列這個。)

如果你想允許回滾到以前的版本 - 我只是將每個版本作爲一個單獨的存儲文件,然後有一個指向最近的指針。 (如果您將指針更新爲寫操作的最後一步,這還將提供額外的保護,防止將損壞的數據輸入到您的應用程序 - 儘管您還必須準備將此指針也損壞。由於這基本上是一個提交步驟,因此您可以將損壞的指針解釋爲「使用最新版本」。)

是的,此時您可能只想使用Android內置的SQLite功能。 :)