ZipOutputStream不写入文件内容

时间:2010-11-20 17:54:40

标签: java zip stream

我需要压缩来自一个流的数据并将压缩数据放到另一个流中。下面是使用文件操作的代码(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 个答案:

答案 0 :(得分:2)

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.这是从数组中写入的字节数。