Java 标记二进制文件中的数据块

Java 标记二进制文件中的数据块,java,c#,binaryfiles,Java,C#,Binaryfiles,我正在为一个应用程序编写保存逻辑,其中一部分将把数据块的动态列表保存到一个文件中。但是,其中一些数据块可能是由插件提供的(其中可能包含读回数据的逻辑),因此,如果创建数据块的插件已被删除,我需要找到一种方法来正确跳过无法识别的数据块 我目前的解决方案是在每个“块”之前写一个长度(int32),这样如果出现错误,读者可以跳过它,继续阅读下一个块 但是,这需要在写入任何数据之前计算数据的长度,而且由于我们的系统是动态的,并且允许嵌套数据类型,因此我宁愿避免缓存所有数据以测量数据的开销 我正在考虑以某

我正在为一个应用程序编写保存逻辑,其中一部分将把数据块的动态列表保存到一个文件中。但是,其中一些数据块可能是由插件提供的(其中可能包含读回数据的逻辑),因此,如果创建数据块的插件已被删除,我需要找到一种方法来正确跳过无法识别的数据块

我目前的解决方案是在每个“块”之前写一个长度(int32),这样如果出现错误,读者可以跳过它,继续阅读下一个块

但是,这需要在写入任何数据之前计算数据的长度,而且由于我们的系统是动态的,并且允许嵌套数据类型,因此我宁愿避免缓存所有数据以测量数据的开销

我正在考虑以某种方式使用文件标记——我可以扫描文件,寻找一个分离块的非常特定的字节序列。这可以写在每个块之后,而不是之前


还有其他我没有想到的选择吗?我的目标是找到一种立即写入数据的方法,而不需要缓存和测量数据。

拥有一组受支持的块处理程序怎么样。只需在块之前写入枚举id。这样,如果你删除了一个插件,那么该插件的id就可以被忽略。然后转到下一个。由于没有代码,所以很难判断我是否从描述中正确地找到了您,但听起来并不太难。您需要知道加载了哪些插件,以便能够根据区块的处理程序id进行检查,如果这样做有意义的话?此外,您的块大小是否有合理的最大限制?您可以简单地除以最大大小。不能保证使用TCP时,您的数据块的大小与您发送的数据块的大小相同。tCP数据报的最大大小约为1500字节。但路由器和服务器可以拆分和重新组合数据。因此,发送的1450数据报和1475数据报可以作为1460和1465接收。这种错误不会在长消息的中间产生真正的差异,但是你仍然有一个方法来确定何时得到最后一个字节。我们确实有一个注册表,可以将块与所有者进行匹配,目前所有这些都在工作。我可能要切换到一个标记,我只需要选择一个唯一的标记,这样我就可以扫描未识别的块来找到下一个。@jdweng这一切都是通过磁盘上的文件完成的,不涉及网络。@helion3是的,这听起来是一个合理的解决方案。