【问题标题】:java binary files operationsjava二进制文件操作
【发布时间】:2012-02-22 11:24:40
【问题描述】:

我有一堆不同的对象(和对象类型),我想写入二进制文件。首先,我需要将文件结构如下:

`对象类型1

obj1, obj2 ...

对象类型2

obj1, obj2...

....

作为一个二进制文件,这并不能帮助用户阅读它,但我想要一个结构,以便我可以按类型搜索、删除或添加对象,而不是解析整个文件。这是我不知道该怎么做的事情。这甚至可能吗?

【问题讨论】:

  • 你对二进制文件结构的理解是什么?只有0和1一个接一个。
  • 您是否有充分的理由只想使用单个文件?为什么不能接受每个对象一个文件?
  • 结构是指任何可以访问文件部分而不是整个文件的方法。
  • @ARRG 是的,我希望该文件成为一个库。
  • 你听说过序列化吗?

标签: java serialization object binary


【解决方案1】:

您必须在文件开头(或其他地方)保留一个标题,以标记每个对象的位置和长度。

标题的种类和布局很大程度上取决于您计划如何读取和写入文件。例如,如果您打算按名称检索对象,则可以在文件中包含类似这样的内容

object1 500 1050
object2 1550 800
object3 2350 2000
<some padding to cover 500 bytes>
<the 1050 bytes of object1><the 800 bytes of object2><the 2000 bytes of object3> 

并且知道object1从文件中的偏移量400开始,长度为1050字节。

由于您似乎想要存储不同类型的对象,因此您可能需要在标题中添加一些额外的数据。

注意以下事项:

  • 每次添加、删除或修改文件时,都必须在标头中更新后面所有文件的偏移量(例如,如果我删除了 object2,那么 object3 的偏移量现在是 1550)。
  • 如果将标头与数据存储在同一个文件中,则在计算偏移量时必须考虑标头的大小(这会使事情变得更加困难,我建议您将标头和二进制数据分开。
  • 每次要访问对象时都必须读取和解析标头。考虑为您的标头使用标准化格式以避免出现问题(YML 或 XML)。

我不知道有任何库可以帮助您实现这样的功能,但我很确定有一些。也许有人可以推荐一个。

--

另一种解决方案是使用类似 ZipFile(Java 原生支持)之类的东西,并将每个对象编写为不同的 ZipEntry。这样您就不必自己管理对象分离,而只需要担心知道您想要的确切 ZipEntry。

【讨论】:

  • 阅读这些说明后,我意识到为每种类型的对象创建一个文件会容易得多......所以我可以附加到文件中,所以我不必重新计算偏移量跨度>
  • 可能,甚至每个对象一个文件,然后在自己的目录中分组对象类型(或使用名称前缀)。
  • 为每个对象创建一个会导致文件数量非常多,每次应用程序启动时我都必须读取这些文件并将它们加载到内存中......使用 3 或 4 个操作会减少...
猜你喜欢
  • 2014-10-25
  • 2014-01-08
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 2022-01-18
  • 2015-04-26
  • 2014-11-22
  • 2016-07-14
相关资源
最近更新 更多