压缩双打数组时,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));
}
答案 0 :(得分:4)
是什么让你认为:is.read(ba,0,8);
返回8
总是?
简而言之:阅读程序是假的。
答案 1 :(得分:1)
gzip是无损压缩。任何缺失的数据都必须由其他一些问题来解释。
如果第57个元素是最后一个元素,我怀疑在重新打开阅读之前无法关闭输出文件。