java二进制文件操作

java二进制文件操作,java,serialization,object,binary,Java,Serialization,Object,Binary,我有一堆不同的对象(和objec类型),我想将它们写入二进制文件。首先,我需要文件的结构如下: `对象类型1 obj1, obj2 ... 对象类型2 obj1, obj2... 作为一个二进制文件,这并不能帮助用户读取它,但我希望有一个结构,这样我就可以按对象的类型搜索、删除或添加对象,而不是解析整个文件。这是我不知道该怎么做的。甚至可以这样做吗?您必须在文件开头(或其他地方)保留一个标题,以标记每个对象的位置和长度 头的类型和布局在很大程度上取决于您计划如何读写文件。例如,如果您计划按

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

`对象类型1

obj1, obj2 ...
对象类型2

obj1, obj2...


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

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

头的类型和布局在很大程度上取决于您计划如何读写文件。例如,如果您计划按名称检索对象,那么您的文件中可能有如下内容

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> 
object1500 1050
对象21550800
2000年3月2350日
并且知道
object1
从文件中的偏移量400开始,长度为1050字节

由于您似乎有不同类型的对象要存储,因此可能需要向标头添加一些额外的数据

注意以下事项:

  • 每次添加、删除或修改文件时,都必须在标题中更新后续所有文件的偏移量(例如,如果删除object2,则object3的偏移量现在为1550)
  • 如果将头与数据存储在同一个文件中,那么在计算偏移量时必须考虑头的大小(这将使事情变得更加困难,我建议将头和二进制数据分开)
  • <> LI>每次访问对象时都必须读取和解析标头。考虑使用标头的标准格式来避免问题(YML或XML)。
我不知道有哪一个库可以帮助你实现这样的功能,但我很确定有一些库。也许有人可以推荐一个

--


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

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

标题的类型和布局在很大程度上取决于您计划如何读写文件

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> 
object1500 1050
对象21550800
2000年3月2350日
并且知道
object1
从文件中的偏移量400开始,长度为1050字节

由于您似乎有不同类型的对象要存储,因此可能需要向标头添加一些额外的数据

注意以下事项:

  • 每次添加、删除或修改文件时,都必须在标题中更新后续所有文件的偏移量(例如,如果删除object2,则object3的偏移量现在为1550)
  • 如果将头与数据存储在同一个文件中,那么在计算偏移量时必须考虑头的大小(这将使事情变得更加困难,我建议将头和二进制数据分开)
  • <> LI>每次访问对象时都必须读取和解析标头。考虑使用标头的标准格式来避免问题(YML或XML)。
我不知道有哪一个库可以帮助你实现这样的功能,但我很确定有一些库。也许有人可以推荐一个

--


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

您对二进制文件的结构有何理解?只有0和1一个接一个。您是否有充分的理由只想使用单个ZipEntrye文件?为什么不能接受每个对象一个文件?我所说的结构是指任何可以访问文件部分而不是整个文件的方法。@ARRG是的,我希望文件是一个库。你听说过序列化吗?你对二进制文件的结构有何理解?只有0和1一个接一个。有什么好的理由吗关于为什么只想使用一个文件?为什么不能接受每个对象一个文件?我所说的结构是指任何可以访问文件的一部分而不是整个文件的方法。@ARRG是的,我希望文件是一个库。你听说过序列化吗?阅读这些说明,我意识到为e每个类型的对象…这样我就可以附加到文件中,所以我可能不必重新计算偏移量,甚至不必为每个对象重新计算一个文件,然后将对象类型分组到自己的目录中(或使用名称前缀).为每个对象创建一个文件将导致文件数量非常多,每次应用程序启动时我都必须读取这些文件并将其加载到内存中…使用3或4个操作将减少…阅读这些说明我意识到为每种类型的对象创建一个文件将更容易…因此我可以附加到文件中,因此我没有可能要重新计算偏移量,甚至是每个对象一个文件,然后在自己的目录中对对象类型进行分组(或使用名称前缀)。为每个对象创建一个偏移量将导致文件数量非常多,每次应用程序启动时我都必须读取这些文件并将其加载到内存中…使用3或4个,操作将更少。。。