原文: https://howtodoinjava.com/java/io/unzip-file-with-subdirectories/

Java 代码示例,它使用java.util.zip包从压缩的 zip 文件中解压缩并提取文件。 在此示例中,代码打开一个 zip 文件并以与目录浏览类似的方式开始遍历这些文件。 如果找到目录条目,则创建目录。 如果找到文件条目,则写入解压缩的文件。

解压缩文件示例

  1. import java.io.BufferedInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.nio.file.FileSystem;
  6. import java.nio.file.FileSystems;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.util.Enumeration;
  10. import java.util.zip.ZipEntry;
  11. import java.util.zip.ZipFile;
  12. public class Main
  13. {
  14. public static void main(String[] args)
  15. {
  16. //Open the file
  17. try(ZipFile file = new ZipFile("files.zip"))
  18. {
  19. FileSystem fileSystem = FileSystems.getDefault();
  20. //Get file entries
  21. Enumeration<? extends ZipEntry> entries = file.entries();
  22. //We will unzip files in this folder
  23. String uncompressedDirectory = "uncompressed/";
  24. Files.createDirectory(fileSystem.getPath(uncompressedDirectory));
  25. //Iterate over entries
  26. while (entries.hasMoreElements())
  27. {
  28. ZipEntry entry = entries.nextElement();
  29. //If directory then create a new directory in uncompressed folder
  30. if (entry.isDirectory())
  31. {
  32. System.out.println("Creating Directory:" + uncompressedDirectory + entry.getName());
  33. Files.createDirectories(fileSystem.getPath(uncompressedDirectory + entry.getName()));
  34. }
  35. //Else create the file
  36. else
  37. {
  38. InputStream is = file.getInputStream(entry);
  39. BufferedInputStream bis = new BufferedInputStream(is);
  40. String uncompressedFileName = uncompressedDirectory + entry.getName();
  41. Path uncompressedFilePath = fileSystem.getPath(uncompressedFileName);
  42. Files.createFile(uncompressedFilePath);
  43. FileOutputStream fileOutput = new FileOutputStream(uncompressedFileName);
  44. while (bis.available() > 0)
  45. {
  46. fileOutput.write(bis.read());
  47. }
  48. fileOutput.close();
  49. System.out.println("Written :" + entry.getName());
  50. }
  51. }
  52. }
  53. catch(IOException e)
  54. {
  55. e.printStackTrace();
  56. }
  57. }
  58. }

示例如何运作

下面列出的事情在上面的示例中依次发生。

  1. ZipFile对象表示.zip文件,并用于访问其信息。
  2. ZipEntry类表示 zip 文件中的条目-文件或目录。
  3. 每个ZipEntry实例都具有压缩和未压缩的大小信息,名称以及未压缩字节的输入流。
  4. 使用InputStreamBufferedInputStream,我们将未压缩的字节读入字节缓冲区,然后使用FileOutputStream将其写入文件。
  5. 继续这样做,直到处理完整个文件。

将我的问题放在评论部分。

学习愉快!