微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FileOutputStream 保存期间看似随机的文件损坏

如何解决FileOutputStream 保存期间看似随机的文件损坏

我有一个 Java Android 应用程序,可以定期保存用户数据。它通常包含大量数据,可能需要几分钟才能保存。但是,它已经这样部署了很长时间并且运行良好。

然而,文件随机损坏。在打开文件时经过非常细致的调试输出,我可以指出在读取数据时发现第一个不一致的确切位置。

// This is just a small section of the data being read. I'm outputting it as it's coming in. This data is in no special position in the middle of the file
// (The file when last saved correctly)
// etc........
// ...........
node: 169,1.4,100.0,-0.0,0.0,1f1f1fff
node: 222,1.0,100,45.0,1f1f1fff
node: 180,-90.0,1f1f1fff

// (The file that is corrupted)
// etc........
// ...........
node: 169,2.3429216E-38,7f7fffff
                            ^^^ why 0.0?,should be "-90.0",everything from here on is wrong...

FileOutputStream 写入错误数据的可能原因是什么?它封装在 GZIPOutputStream 中。

当我将浮点值写入流时,我使用了这个函数

public static void floatToOutputStream(float v,OutputStream outputStream) throws IOException {
    int bits = Float.floatToIntBits(v);
    outputStream.write((bits >> 24) & 0xff);
    outputStream.write((bits >> 16) & 0xff);
    outputStream.write((bits >> 8) & 0xff);
    outputStream.write(bits & 0xff);
}

它显然有效,因为所有其他字节的数据都正确保存在这文件和无数其他用户文件中。那么为什么它看似随机失败?

我注意到在 Java 的 DataOutputStream 中,它们的功能是这样的:

public static void floatToOutputStream(float v,OutputStream outputStream) throws IOException {
    intToOutputStream(Float.floatToIntBits(v),outputStream);
}

public static void intToOutputStream(int v,OutputStream outputStream) throws IOException {
    outputStream.write((v>>> 24) & 0xFF);
    outputStream.write((v>>> 16) & 0xFF);
    outputStream.write((v>>>  8) & 0xFF);
    outputStream.write((v>>>  0) & 0xFF);
}

这种变化会防止这种不一致吗?还有哪些其他可能的原因? Android 环境?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。