Java 通过'发送和接收数据;嘈杂';数据流
我的Java程序将其数据保存到一个二进制文件中,并且(非常)偶尔该文件会由于硬件故障而损坏。通常只有几兆字节的文件会受到影响。为了解决这个问题,我可以写两次数据,但这似乎有些过头了——我更愿意将文件大小的增加限制在20%左右Java 通过'发送和接收数据;嘈杂';数据流,java,algorithm,Java,Algorithm,我的Java程序将其数据保存到一个二进制文件中,并且(非常)偶尔该文件会由于硬件故障而损坏。通常只有几兆字节的文件会受到影响。为了解决这个问题,我可以写两次数据,但这似乎有些过头了——我更愿意将文件大小的增加限制在20%左右 在我看来,这类似于通过“嘈杂”数据流发送信息的问题。是否有Java库或算法可以将冗余信息写入输出流,以便接收器在引入噪声时能够恢复?有噪声通信的问题已经有了一个很好的解决方案:发送数据(与数据一起)的哈希/CRC,这是(重新)由接收者评估,并重新请求是否在途中发生损坏 换句
在我看来,这类似于通过“嘈杂”数据流发送信息的问题。是否有Java库或算法可以将冗余信息写入输出流,以便接收器在引入噪声时能够恢复?有噪声通信的问题已经有了一个很好的解决方案:发送数据(与数据一起)的哈希/CRC,这是(重新)由接收者评估,并重新请求是否在途中发生损坏
换句话说:使用哈希算法检查损坏情况,并在必要时重新传输,而不是冗余发送数据 您需要的是纠错码。请查看以下代码: 此外,维基百科的文章可能会为您提供更多信息: 两种可能是前向纠错,即发送冗余数据;或者是错误检测系统,即检查哈希值并重新请求任何已损坏的数据。如果腐败是意料之中的事情,那么纠错就是要采取的方法
在不了解环境本质的情况下,给出更具体的建议是不可能的,但这应该让你开始了解如何解决这个问题。听起来有些过时,但很有趣,我刚刚与编写“移动”应用程序的人进行了类似的对话(不是PDA/手机,而是石油和天然气钻井平台式的现场应用程序). 由于环境的原因,他们实际上是通过修改的
XMODEM
CRC传输写入磁盘的。我认为很容易说,但除了:
使用“rw”中的RandomAccessFile写入数据块(512-4096字节),重新读取以进行CRC检查,如果不匹配则重新写入,或者迭代到下一个块。对于操作系统文件缓存,我很好奇这有多有效?纠错码。如果我正确地回忆起,额外的比特数作为块大小的logn,因此块越大,校正比特越少
您应该选择一种机制,在普通文本之间交错校验位(可能是最方便的额外字符)。这允许在数据流中存在可修复的漏洞,同时仍具有可读性。CRC和ECC是检测和(对于ECC)从噪声导致的数据损坏中恢复的可靠解决方案。然而,任何方案都只能应对一定程度的噪音。超过该级别,您将发现未被发现和/或无法纠正的错误。第二个问题是,只有在注入噪声之前添加ECCs/CRC,这些方案才会起作用 但我有点怀疑您可能试图解决错误的问题:
- 如果在通过通信线路传输文件时发生损坏,则应使用内置ECC etc支持的通信硬件
- 如果在将文件写入光盘时发生损坏,则应更换光盘