我的Java程序将其数据保存到二进制文件中,并且(非常)偶尔由于硬件故障导致文件损坏。通常情况下,几兆字节大小的文件只有少量字节受到影响。为了应对这个问题,我可以将数据写两次,但这似乎过于浪费——我希望将文件大小增加限制在大约20%。
这对我来说似乎类似于通过“嘈杂”的数据流发送信息的问题。是否有Java库或算法可以向输出流中写入冗余信息,以便接收者可以在引入噪声时进行恢复?
纠错码。如果我没记错,对于块大小而言,额外比特的数量随log n增加,因此块越大,校正位就越少。
你应该选择一种机制,在正常文本中间交错放置检验位(可能最方便的是作为额外字符)。这样可以在数据流中有可修补的空洞的同时仍然可读。
嘈杂通信的问题已经有了一个很好的解决方案:发送数据的哈希/CRC(与数据一起),接收方重新评估并在路上出现损坏时重新请求。
换句话说:使用哈希算法检查损坏并在必要时重新传输,而不是冗余地发送数据。
如果在通过通信线传输文件时发生损坏,则应使用具有内置ECC等支持的通信硬件。
如果在将文件写入磁盘时发生损坏,则应更换磁盘。
您还应考虑可能是您的应用程序损坏了数据;例如,由于代码中的某些同步错误。