简体   繁体   English

从android中的zip解压缩文件夹

[英]Extract folders from zip in android

My application has to download a zip and has to unzip it in the application folder. 我的应用程序必须下载一个zip,并且必须在应用程序文件夹中解压缩它。 The problem is that the zip doesn't have files but folders and in each folder there are different files. 问题是zip没有文件而是文件夹,每个文件夹中都有不同的文件。 I would to keep the same structure but I don't know how do it. 我会保持相同的结构,但我不知道它是怎么做的。 I succeed if i do it with a zip of files but not with a zip of folders. 如果我用一个文件的拉链但没有文件夹的拉链,我成功了。 There is somebody who knows how do it? 有人知道它是怎么做到的吗? Many thanks. 非常感谢。

You will need to create the directories for each directory entry in the ZIP archive. 您需要为ZIP存档中的每个目录条目创建目录。 Here is a method I wrote and use that will keep the directory structure: 这是我编写和使用的方法,它将保留目录结构:

/**
 * 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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM