ZipOutputStream не записывает содержимое файла - PullRequest
3 голосов
/ 20 ноября 2010

Мне нужно заархивировать данные, поступающие из одного потока, и поместить заархивированные данные в другой.Вот код, который работает с файлами (MyOutputStream - это простая оболочка FileOutputStream, используемая в целях отладки).Этот код работает нормально.

        ZipOutputStream jos = new ZipOutputStream( new MyOutputStream(new FileOutputStream(zipFileName)));
        jos.setLevel(Deflater.DEFAULT_COMPRESSION);
        jos.putNextEntry(new ZipEntry("test.txt"));
        FileInputStream in = new FileInputStream("test.txt");

        int len;
        while ((len = in.read(buffer)) > 0){
             jos.write(buffer, 0, len);
        }
        jos.closeEntry();
        jos.close();

В моем реальном приложении мне приходится иметь дело с более сложными потоками.Фактически, потоки используются для взаимодействия CORBA.Тем не менее, данные успешно прочитаны.Но когда я пытаюсь сделать jos.write(buffer, 0, len);, никакие данные не записываются в выходной поток, лежащий в основе ZipOutputStream.Однако заголовки zip-файлов, комментарии к записям и центральный каталог написаны успешно, поэтому я получаю абсолютно правильный zip-файл с единственным исключением, что файлы пусты.

Может быть, кто-нибудь видел такое раньше?Любая помощь приветствуется.

РЕДАКТИРОВАТЬ Вот мой реальный код, который может быть полезен:

String fileName = fullSourcePath.substring(fullSourcePath.lastIndexOf('\\') + 1, fullSourcePath.length());
WrapperOutputStream out = new WrapperOutputStream(newexchangeStream64);
ZipOutputStream jos = new ZipOutputStream(out);
jos.setLevel(Deflater.NO_COMPRESSION);

jos.putNextEntry(new ZipEntry(fileName));
jos.setComment("Comment");
IDLDataHolder data = new IDLDataHolder();
LongHolder dataAmount = new LongHolder();
LongHolder written = new LongHolder();

while (true) {
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount);
    if (0 == dataAmount.value) {
        break;
    }

    jos.write(data.value, (int)dataAmount.value, (int)written.value);
}
jos.closeEntry();
jos.close();

1 Ответ

2 голосов
/ 20 ноября 2010
LongHolder written = new LongHolder();

while (true) {
    exchangeStream64.Read(data, READ_AMOUNT, dataAmount);
    if (0 == dataAmount.value) {
        break;
    }

    jos.write(data.value, (int)dataAmount.value, (int)written.value);
}

Это может быть просто ошибка копирования и вставки, но последний параметр jos.write всегда равен 0. Это количество байтов для записи из массива.

...