2013-11-21 156 views
0

所以即時通訊開發Android應用程序,排序的圖書閱讀器。這些書籍存儲爲500MB +二進制文件,其中存儲有特定對象,並且存儲在一個小型二進制文件中,該文件包含對大文件中特定對象的映射。我需要找到執行某個發佈文件更新的最有效方法。 該進來的更新包將包含偏移需要從原來的大文件,一組將在大文件的末尾添加新的對象刪除的對象+ lenghts,以及新的映射更新後相對較小的文件明顯地完成了。Java更新大型二進制文件

伊夫用Google搜索了很多,但我仍然不能找出是否那裏有任何比複製我想要的內容更好的解決方案,以保持到一個新文件。有沒有更有效的方法來做到這一點?我的意思是,我所提到的要求需要雙盤空間作爲主要大文件,而且似乎也沒有任何快速的方式。

Thx提前,蘋果

+1

都能跟得上的,這是不可能的。另外一個500MB +的二進制文件聽起來像是一種保存圖書數據的非常糟糕的方式。數據庫會更好。 – Kayaman

+1

如果你編寫一個新的文件系統(在一個文件中),你可以有效地做到這一點。嘗試找到一個非常簡單的數據庫(恕我直言,SQLite3可能對此任務效率太低)。應該更像是一個文件系統而不是數據庫。另一種方法是將開源的'patch'程序改編成Java。 – hgoebl

+0

感謝這篇文章中,這將是一個非常好的解決方案,如果我可以修改進來的文件,但遺憾的是我公司的另一部分處理它,他們不能被arsed做任何修改,他們 –

回答

0

嗯,我想通了,這並不需要文件的另一個副本的解決方案。 我隨便拿第一偏移刪除,跳轉到偏移+其lenght,採取字節bounch可以說最小值(距離下一次刪除的對象)和最大1K,它在刪除條目的偏移粘貼,尋找一個又一個刪除n要知道,如果我解釋它以適當的方式,但是很好,經常asnwering你自己的問題導致了此類問題的xD

0

這是一個常見的問題。

通常情況下,這種文件存儲在一定的「模式」。

也就是說,他們是在永久存儲序列化對象。

所以,只要你懂的「模式」 - 更準確 - 數據對象的結構,你可以使用的RandomAccessFile來讀取該文件的特定部分。

以一個非常簡單例子:

1. You load the index of contents(like several mega bytes) into memory 
2. When you want to look up the a word, you first search in the index of contents, and find the "address" of the explanation of this word in the huge file 
3. You read the particular part of the file and get the detailed content 
4. Done 

類似的方法也可能適用於文件的更新,請參考隨機訪問文件的Java文檔。

+0

好,那不是真的情況下,更新的對象不會有相同的長度,也不會成爲原始對象的實際更新,它只是不得不刪除一些對象,並在文件末尾添加一些新對象。我詢問了一個合適的方法,通過刪除中間的一些字節來更新文件。 –