java - ZipOutputStream 不写入文件内容

标签 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,只有一个异常(exception),即文件为空。

也许有人以前见过这种行为?感谢您的帮助。

编辑 这是我的真实代码,因为它可能有用:

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();

最佳答案

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,即从数组中写入的字节数。

关于java - ZipOutputStream 不写入文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234122/

相关文章:

java - Apache Poi - 如何从 Word 文档中删除所有链接

java - 用于压缩/解压缩的可移植 Java 解决方案

scala - 如何通过 Scala 中的 Play Framework 2.5 流式传输压缩文件(即时)?

php - 在PHP中使用fsockopen与gmail imap服务器通信时出现问题

java - 是否可以使用java读取传入数据流,从服务器到.exe客户端(使用C++编码)?

java - 有没有办法让java中的前5名显示变量名称?

java - 更改 JTextArea(不是 JTextPane)中的行距

java - 重用 HttpsUrlConnection...不想每次都获得新连接。怎么复用?

linux - Unix Shell - Zip 命令

php - 如何通过stream_get_contents()连续监听多个TCP流?