首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩压缩

压缩压缩
EN

Stack Overflow用户
提问于 2013-03-13 08:09:00
回答 1查看 4.8K关注 0票数 6

我试图使用java将目录内容压缩到zip归档中。一切都很好,但我只想澄清一些事实。下面是我用来压缩文件的代码:

代码语言:javascript
复制
public void pack(@Nonnull String archiveName, @Nonnull File outputDir, @Nonnull File targetDir) {
  File zipFile = new File(outputDir, "out.zip");

  ZipOutputStream zipOutputStream = null;
  OutputStream outputStream;
  try {
    // create stream for writing zip archive
    outputStream = new FileOutputStream(zipFile);
    zipOutputStream = new ZipOutputStream(outputStream);
    // write files recursively
    writeFiles(zipOutputStream, targetDir.listFiles(), "");
  } catch (IOException e) {
    LOGGER.error("IO exception while packing files to archive", e);
  } finally {
    // close output streams
    if (zipOutputStream != null) {
      try {
        zipOutputStream.close();
      } catch (IOException e) {
        LOGGER.error("Unable to close zip output stream", e);
      }
    }
  }
}

/**
 * Writes specified files and their children (in case of directories) to archive
 *
 * @param zipOutputStream archive output stream
 * @param files           which should be added to archive
 * @param path            path relative of root of archive where files should be placed
 */
private void writeFiles(@Nonnull ZipOutputStream zipOutputStream, @Nullable File[] files, @Nonnull String path) throws IOException {
  if (files == null || files.length == 0) {
    return;
  }

  for (File file : files) {
    if (file.isDirectory()) {
      // recursively add files in this directory
      String fullDirectoryName = path + file.getName() + "/";
      File[] childFiles = file.listFiles();
      if (childFiles != null && childFiles.length > 0) {
        // write child files to archive. current directory will be created automatically
        writeFiles(zipOutputStream, childFiles, fullDirectoryName);
      } else {
        // empty directory. write directory itself to archive
        ZipEntry entry = new ZipEntry(fullDirectoryName);
        zipOutputStream.putNextEntry(entry);
        zipOutputStream.closeEntry();
      }
    } else {
      // put file in archive
      BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
      zipOutputStream.putNextEntry(new ZipEntry(path + file.getName()));
      ByteStreams.copy(bufferedInputStream, zipOutputStream);
      zipOutputStream.closeEntry();
      bufferedInputStream.close();
    }
  }
}

现在有一些问题:

  1. 在默认情况下(在我的情况下也是如此),我将获得已经压缩的存档(使用Deflate方法),这是否正确?
  2. 如何获得未压缩的存档:

代码语言:javascript
复制
- If I set method `zipOutputStream.setMethod(ZipOutputStream.STORED)` I have to provide size, compressed size (is it will be equal to size?) and crc, otherwise I will get exceptions
- If I don't want to calculate size and crc by myself I can use `DEFLATE` method with zero level: zipOutputStream.setMethod(ZipOutputStream.DEFLATED); zipOutputStream.setLevel(ZipOutputStream.STORED);

,那么,在这种情况下,我完全没有压缩存档,这是正确的吗?

-是否有更方便-明显的方法来创建非压缩档案?

EN

回答 1

Stack Overflow用户

发布于 2013-03-13 08:27:46

与其重新发明轮子,我会认真考虑使用一个现有的库来实现这一点,比如Apache。创建zip文件的基本习语是:

代码语言:javascript
复制
Project p = new Project();
p.init();
Zip zip = new Zip();
zip.setProject(p);
zip.setDestFile(new File(outputDir, "out.zip"));
FileSet fs = new FileSet();
fs.setProject(p);
fs.setDirectory(targetDir);
zip.addFileset(fs);
zip.perform();

默认情况下,您将得到一个压缩的存档。对于未压缩的压缩压缩,只需添加以下内容

代码语言:javascript
复制
zip.setCompress(false);

setDestFile之后(实际上在perform之前的任何地方)。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15379925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档