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 (将#修改为@)