mhs*_*ams 8 java file-io binaryfiles
我有一个以下格式的二进制文件:
[N bytes identifier & record length] [n1 bytes data]
[N bytes identifier & record length] [n2 bytes data]
[N bytes identifier & record length] [n3 bytes data]
Run Code Online (Sandbox Code Playgroud)
如你所见,我有不同长度的记录.在每个记录中,我有N个字节固定,其中包含和id以及记录中的数据长度.
这个文件很大,可以包含3百万条记录.
我想通过应用程序打开此文件,让用户浏览和编辑记录.(插入/更新/删除记录)
我的初步计划是从原始文件创建和索引文件,并为每条记录保留下一个和上一个记录地址,以便轻松地前后导航.(某种链表,但文件不在内存中)
是否有库(java库)来帮助我实现这个要求?
您认为有用的任何推荐或经验?
-----------------编辑-------------------------------- --------------
感谢您的指导和建议,
更多信息:
原始文件及其格式不受我的控制(它是第三方文件),我无法更改文件格式.但我必须阅读它,让用户浏览记录并编辑其中一些(插入新记录/更新现有记录/删除记录),最后将其保存回原始文件格式.
你还推荐使用DataBase而不是普通的索引文件吗?
-----------------第二次编辑------------------------------- ---------------
更新模式下的记录大小是固定的.它表示更新(编辑)的记录与原始记录的长度相同,除非用户删除记录并创建不同格式的另一条记录.
非常感谢
说真的,您不应该为此使用二进制文件。您应该使用数据库。
尝试将其实现为常规文件的问题源于操作系统不允许您在现有文件的中间插入额外的字节。因此,如果您需要插入一条记录(除末尾之外的任何位置)、更新一条记录(具有不同的大小)或删除一条记录,您将需要:
所有这些都很复杂和/或昂贵。
幸运的是,有一类软件可以实现这种事情。它被称为数据库软件。有多种选择,从使用全面的 RDBMS 到使用 BerkeleyDB 文件等轻量级解决方案。
为了响应您的第一次和第二次编辑,数据库仍然会更简单。
然而,对于这个用例来说,有一种替代方案可能比使用数据库表现得更好......而无需进行复杂的可用空间管理。
读取文件并构建一个内存索引,将 id 映射到文件位置。
创建第二个文件来保存新的和更新的记录。
执行记录添加/更新/删除:
通过将新记录写入第二个文件的末尾并为其添加索引条目来处理添加。
通过将更新的记录写入第二个文件的末尾并更改现有索引条目以指向它来处理更新。
删除是通过删除记录键的索引条目来处理的。
按如下方式压缩文件:
创建一个新文件。
按顺序读取旧文件中的每条记录,并检查记录键的索引。如果该条目仍然指向该记录的位置,则将该记录复制到新文件中。否则跳过它。
对第二个文件重复步骤 4.2。
如果我们成功完成上述所有操作,请删除旧文件和第二个文件。
请注意,这依赖于能够将索引保留在内存中。如果这不可行,那么实现将会更加复杂……并且更像数据库。
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |