从android中的zip解压缩文件夹

时间:2016-11-28 16:38:54

标签: android zip unzip directory

我的应用程序必须下载zip并且必须在应用程序文件夹中解压缩它。问题是zip没有文件而是文件夹,每个文件夹中都有不同的文件。我会保持相同的结构,但我不知道它是怎么做的。如果我用一个文件的拉链但没有文件夹的拉链,我成功了。 有人知道它是怎么做到的吗? 非常感谢。

1 个答案:

答案 0 :(得分:3)

您需要为ZIP存档中的每个目录条目创建目录。这是我编写和使用的方法,它将保留目录结构:

/**
 * Unzip a ZIP file, keeping the directory structure.
 *
 * @param zipFile
 *     A valid ZIP file.
 * @param destinationDir
 *     The destination directory. It will be created if it doesn't exist.
 * @return {@code true} if the ZIP file was successfully decompressed.
 */
public static boolean unzip(File zipFile, File destinationDir) {
  ZipFile zip = null;
  try {
    destinationDir.mkdirs();
    zip = new ZipFile(zipFile);
    Enumeration<? extends ZipEntry> zipFileEntries = zip.entries();
    while (zipFileEntries.hasMoreElements()) {
      ZipEntry entry = zipFileEntries.nextElement();
      String entryName = entry.getName();
      File destFile = new File(destinationDir, entryName);
      File destinationParent = destFile.getParentFile();
      if (destinationParent != null && !destinationParent.exists()) {
        destinationParent.mkdirs();
      }
      if (!entry.isDirectory()) {
        BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry));
        int currentByte;
        byte data[] = new byte[DEFUALT_BUFFER];
        FileOutputStream fos = new FileOutputStream(destFile);
        BufferedOutputStream dest = new BufferedOutputStream(fos, DEFUALT_BUFFER);
        while ((currentByte = is.read(data, 0, DEFUALT_BUFFER)) != EOF) {
          dest.write(data, 0, currentByte);
        }
        dest.flush();
        dest.close();
        is.close();
      }
    }
  } catch (Exception e) {
    return false;
  } finally {
    if (zip != null) {
      try {
        zip.close();
      } catch (IOException ignored) {
      }
    }
  }
  return true;
}