【问题标题】:Create Java-Zip-Archive from existing OutputStream从现有的 OutputStream 创建 Java-Zip-Archive
【发布时间】:2011-04-30 07:56:20
【问题描述】:

如果我不想将生成的存档写入磁盘而是将其发送到其他地方,是否可以在 Java 中创建一个 Zip-Archive?

这个想法是,当您想通过 HTTP(例如从 Database-Blob 或任何其他数据存储)将 Zip-Archive 发送给用户时,在磁盘上创建文件可能是一种浪费。

我想创建一个

java.util.zip.ZipOutputStream 

或者一个

apache.commons.ZipArchiveOutputStream

Feeder 将是来自我的 Subversion 存储库的 ByteArrayOutputStream

【问题讨论】:

    标签: java apache-commons


    【解决方案1】:

    是的,这绝对有可能!

    ZipOutputStream 上使用putNextEntry 方法创建您的Zip 条目,然后通过在ZipOutputStream 上调用write 将字节放入压缩文件中。对于该方法的参数byte[],只需使用toByteArray 方法从ByteArrayOutputStream 中提取它们即可。

    ZipOutputStream 可以发送到任何地方,因为它的构造函数只需要一个OutputStream,所以可以是例如你的 HTTP 响应。

    【讨论】:

    • 好的,成功了!但是,我如何创建实际包含文件本身的目录呢?现在我得到了所有文件,很好,但是目录在根节点中被解压缩为零字节长度的文件,所以根本没有层次结构:-(
    • ZIP 文件只包含一个平面文件列表。但是,文件名可能包含路径信息。只需在目录dir 中添加一个名称为dir/file.txtZipEntry:即file.txt
    • 是的,通过添加绝对 URL 一切正常。非常感谢!
    【解决方案2】:

    类似的东西会起作用:

    ZipOutputStream zs = new ZipOutputStream(outputStream) ;
    ZipEntry e = new ZipEntry(fileName);
    zs.putNextEntry(e);
    zs.write(...);
    zs.close();
    

    【讨论】:

      【解决方案3】:

      输入: D:/in.xml

      输出: D:/final.zip(有 2 个文件 001zip.txt,002zip.txt)

      代码:

      package com.stackoverflow.filezip;
      
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.util.zip.ZipEntry;
      import java.util.zip.ZipOutputStream;
      
      public class fileZip {
      
      public static void main(String[] args) {
      
          try {
      InputStream in = new FileInputStream("D:/in.xml");
      OutputStream out=   new FileOutputStream("D:/final.zip");
      ZipOutputStream zs = new ZipOutputStream(out);
      
                  ZipEntry e1 = new ZipEntry("001zip.txt");
                  ZipEntry e2 = new ZipEntry("002zip.txt");
                  zs.putNextEntry(e1);
                  zs.write("test content in file1".getBytes());
                  zs.putNextEntry(e2);
                  zs.write("test content in file2".getBytes());
      
                  zs.close();
             }
             catch (Exception e) {
                  e.printStackTrace();
                                 }
                                             }
                             }
      

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 2011-04-24
        • 2010-11-16
        • 1970-01-01
        相关资源
        最近更新 更多