ZipUtils.java 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package com.macro.mall.tiny.common.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.nio.charset.Charset;
  6. import java.nio.file.Files;
  7. import java.nio.file.Path;
  8. import java.nio.file.Paths;
  9. import java.nio.file.StandardOpenOption;
  10. import java.util.concurrent.ExecutionException;
  11. import java.util.zip.ZipEntry;
  12. import java.util.zip.ZipFile;
  13. import java.util.zip.ZipInputStream;
  14. public class ZipUtils {
  15. public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
  16. ZipUtils.unPacket(Paths.get("E:/WorkSpace/doc-manager-master/temp/四川.zip"), Paths.get("E:/WorkSpace/doc-manager-master/power"), "gbk");
  17. }
  18. /**
  19. * 解压文件并录入对应目录
  20. *
  21. * @param file 压缩文件
  22. * @param targetDir 解压文件输出的目录
  23. * @throws IOException
  24. */
  25. public static void unPacket(Path file, Path targetDir, String charset) throws IOException {
  26. if (!Files.exists(targetDir)) {
  27. Files.createDirectories(targetDir);
  28. }
  29. // 创建zip对象
  30. try (ZipFile zipFile = new ZipFile(file.toFile(), Charset.forName(charset))) {
  31. // 读取zip流
  32. try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file), Charset.forName(charset))) {
  33. ZipEntry zipEntry;
  34. // 遍历每一个zip项
  35. while ((zipEntry = zipInputStream.getNextEntry()) != null) {
  36. // 获取zip项目名称
  37. String entryName = zipEntry.getName();
  38. System.out.println(entryName);
  39. // 构建绝对路径
  40. Path entryFile = targetDir.resolve(entryName);
  41. if (zipEntry.isDirectory()) { // 文件夹
  42. if (!Files.isDirectory(entryFile)) {
  43. Files.createDirectories(entryFile);
  44. }
  45. } else { // 文件
  46. if (Files.exists(entryFile)) {
  47. continue;
  48. }
  49. // 读取zip项数据流
  50. try (InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry)) {
  51. try (OutputStream fileOutputStream = Files.newOutputStream(entryFile, StandardOpenOption.CREATE_NEW)) {
  52. byte[] buffer = new byte[2048];
  53. int length;
  54. while ((length = zipEntryInputStream.read(buffer)) != -1) {
  55. fileOutputStream.write(buffer, 0, length);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }
  63. }
  64. }