GZIPOutputStream是否已知在压缩期间丢失数据?

时间:2011-07-16 19:46:03

标签: java gzipoutputstream

压缩双打数组时,GZIPOutputStream有一个非常奇怪的问题。在第57个元素,当我重新加载数据时,我得到一个小的差异:

57 > 3.003727492141554E7 3.0037273913440887E7
1900: false
57 > -6.110783629228158E7 -6.110783629076558E7
2000: false

1900年和2000年是两组不同的双打。左边的值是原始值。

当我使用没有GZIP的简单FileOutputStream时,我不会遇到问题。为什么? GZIP输出流是否已知松散信息?

修改

以下是我读写数据的方法:

public static final double[] coefficients = new double[1161289];

...

public static void dump(File f) throws FileNotFoundException, IOException {

    OutputStream os = FileUtils.zipContent(f);

    byte[] ba = new byte[8];
    ByteBuffer BF = ByteBuffer.wrap(ba);
    BF.order(ByteOrder.BIG_ENDIAN);

    for (int i=0;i<coefficients.length;i++) {
        BF.putDouble(0, coefficients[i]);
        os.write(ba,0,8);
    }

    os.close();

}

public static void load(File f) throws FileNotFoundException, IOException {

    InputStream is = FileUtils.readZippedContent(f);

    byte[] ba = new byte[8];
    final ByteBuffer BF = ByteBuffer.wrap(ba);
    BF.order(ByteOrder.BIG_ENDIAN);

    for (int i=0;i<coefficients.length;i++) {
        is.read(ba,0,8);
        coefficients[i] = BF.getDouble(0);
    }

}

...

public static GZIPOutputStream zipContent(File f)
        throws FileNotFoundException, IOException {

    return new GZIPOutputStream(new FileOutputStream(f));

}

public static GZIPInputStream readZippedContent(File f)
        throws FileNotFoundException, IOException {

    return new GZIPInputStream(new FileInputStream(f));

}

2 个答案:

答案 0 :(得分:4)

是什么让你认为:is.read(ba,0,8);返回8 总是

简而言之:阅读程序是假的。

答案 1 :(得分:1)

gzip是无损压缩。任何缺失的数据都必须由其他一些问题来解释。

如果第57个元素是最后一个元素,我怀疑在重新打开阅读之前无法关闭输出文件。