Известно ли, что GZIPOutputStream теряет данные во время сжатия? - PullRequest
1 голос
/ 16 июля 2011

У меня очень странная проблема с GZIPOutputStream при сжатии массива double. На 57-м элементе я получаю небольшое расхождение при перезагрузке данных:

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

1900 и 2000 - это два разных набора пар. Левое значение является исходным значением.

Когда я использую простой FileOutputStream без GZIP, проблема не возникает. Зачем? Известно ли, что поток вывода GZIP теряет информацию?

EDIT

Вот как я читаю и записываю данные:

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 ]

4 голосов
/ 17 июля 2011

что заставляет вас думать, что: is.read(ba,0,8); возвращает 8 всегда ?

Короче говоря: процедура чтения фальшивая.

1 голос
/ 16 июля 2011

gzip - сжатие без потерь. любые недостающие данные должны быть объяснены какой-то другой проблемой.

если 57-й элемент является последним элементом, я подозреваю, что не удалось закрыть выходной файл перед повторным открытием для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...