2013-11-21 111 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

好,那不是真的情况下,更新的对象不会有相同的长度,也不会成为原始对象的实际更新,它只是不得不删除一些对象,并在文件末尾添加一些新对象。我询问了一个合适的方法,通过删除中间的一些字节来更新文件。 –