Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java更新大型二进制文件_Java_Android_File_Binary_Updating - Fatal编程技术网

Java更新大型二进制文件

Java更新大型二进制文件,java,android,file,binary,updating,Java,Android,File,Binary,Updating,所以我在开发Android应用程序,有点像一个图书阅读器。这些书存储为500mb+的二进制文件,其中存储了某些对象,并存储在一个小的二进制文件中,该文件包含到大文件中特定对象的映射。我需要找到最有效的方法来更新某些发布文件。 输入更新包将包含相对较小的文件,其中偏移量+长度为需要从原始大文件中删除的对象,一组新对象将添加到大文件末尾,以及更新完成后的新映射 我在谷歌上搜索了很多,但我还是找不到比把我想保存的内容复制到新文件中更好的解决方案。还有更有效的方法吗?我的意思是,我提到的aproach需

所以我在开发Android应用程序,有点像一个图书阅读器。这些书存储为500mb+的二进制文件,其中存储了某些对象,并存储在一个小的二进制文件中,该文件包含到大文件中特定对象的映射。我需要找到最有效的方法来更新某些发布文件。 输入更新包将包含相对较小的文件,其中偏移量+长度为需要从原始大文件中删除的对象,一组新对象将添加到大文件末尾,以及更新完成后的新映射

我在谷歌上搜索了很多,但我还是找不到比把我想保存的内容复制到新文件中更好的解决方案。还有更有效的方法吗?我的意思是,我提到的aproach需要两倍于主大文件的磁盘空间,而且它似乎也不是很快


Thx预先,Mac这是一个常见的问题

通常,此类文件以某种“模式”存储

也就是说,它们是永久存储上的序列化对象

因此,只要您知道数据对象的“模式”——更准确地说——结构,就可以使用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文档。

我找到了一个不需要另一份文件的解决方案。
我只需要取第一个要删除的偏移量,跳转到偏移量+其长度,取一个字节的跳跃量,比如说最小值(到下一个删除对象的距离)和最大值1k,将其粘贴到删除条目的偏移量处,然后寻找另一个要删除的偏移量,以确保我是否以正确的方式解释了它,但解释得很好,因为问你自己的问题常常会导致这样的问题xD

不,那是不可能的。此外,500MB+的二进制文件听起来是保存书籍数据的一种非常糟糕的方式。数据库会更好。如果你编写一个新的文件系统(在一个文件中),你可以高效地完成这项工作。尝试找到一个非常简单的数据库(IMHO SQLite3对于这个任务来说可能效率太低)。应该更像一个文件系统而不是数据库。另一种方法是将一个开源
补丁
程序改编成Java。多亏了这个技巧,如果我能修改输入文件,这将是一个非常好的解决方案,但遗憾的是,这是我公司的另一个部门处理的,他们不能对其进行任何修改,更新的对象不一定有相同的长度,也不会是原始对象的实际更新,就像我只需删除一些对象并将一些新对象放在文件末尾。我询问了一个适当的方法通过删除中间的一些字节来更新文件。