Zipper.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package com.yihu.ehr.util.compress;
  2. import com.yihu.ehr.util.operator.StringUtil;
  3. import net.lingala.zip4j.core.ZipFile;
  4. import net.lingala.zip4j.exception.ZipException;
  5. import net.lingala.zip4j.model.FileHeader;
  6. import net.lingala.zip4j.model.ZipParameters;
  7. import net.lingala.zip4j.util.Zip4jConstants;
  8. import java.io.File;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * 文件压缩辅助类
  13. *
  14. * @created Air 2015/5/26.
  15. */
  16. public class Zipper {
  17. /**
  18. * 使用给定密码解压指定的ZIP压缩文件到指定目录
  19. * <p>
  20. * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出
  21. *
  22. * @param zip 指定的ZIP压缩文件
  23. * @param dest 解压目录
  24. * @param passwd ZIP文件的密码
  25. * @return 解压后文件数组
  26. * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
  27. */
  28. public static File[] unzip(String zip, String dest, String passwd) throws ZipException {
  29. File zipFile = new File(zip);
  30. return unzip(zipFile, dest, passwd);
  31. }
  32. /**
  33. * 使用给定密码解压指定的ZIP压缩文件到当前目录
  34. *
  35. * @param zip 指定的ZIP压缩文件
  36. * @param passwd ZIP文件的密码
  37. * @return 解压后文件数组
  38. * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
  39. */
  40. public static File[] unzip(String zip, String passwd) throws ZipException {
  41. File zipFile = new File(zip);
  42. File parentDir = zipFile.getParentFile();
  43. return unzip(zipFile, parentDir.getAbsolutePath(), passwd);
  44. }
  45. /**
  46. * 使用给定密码解压指定的ZIP压缩文件到指定目录
  47. * <p>
  48. * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出
  49. *
  50. * @param dest 解压目录
  51. * @param passwd ZIP文件的密码
  52. * @return 解压后文件数组
  53. * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
  54. */
  55. public static File[] unzip(File zipFile, String dest, String passwd) throws ZipException {
  56. ZipFile zFile = new ZipFile(zipFile);
  57. zFile.setFileNameCharset("GBK");
  58. if (!zFile.isValidZipFile()) {
  59. throw new ZipException("压缩文件不合法,可能被损坏.");
  60. }
  61. File destDir = new File(dest);
  62. if (destDir.isDirectory() && !destDir.exists()) {
  63. destDir.mkdir();
  64. }
  65. if (zFile.isEncrypted()) {
  66. zFile.setPassword(passwd.toCharArray());
  67. }
  68. zFile.extractAll(dest);
  69. List<FileHeader> headerList = zFile.getFileHeaders();
  70. List<File> extractedFileList = new ArrayList<>();
  71. for (FileHeader fileHeader : headerList) {
  72. if (!fileHeader.isDirectory()) {
  73. extractedFileList.add(new File(destDir, fileHeader.getFileName()));
  74. }
  75. }
  76. File[] extractedFiles = new File[extractedFileList.size()];
  77. extractedFileList.toArray(extractedFiles);
  78. return extractedFiles;
  79. }
  80. /**
  81. * @param unzipFile 需要压缩的文件(文件夹)
  82. * @param zipFileName 压缩后的文件名
  83. * @return 成功-File 失败-null
  84. * @throws ZipException
  85. */
  86. public File zipFile(File unzipFile, String zipFileName) throws ZipException {
  87. return zipFile(unzipFile, zipFileName, null);
  88. }
  89. /**
  90. * @param unzipFile 需要压缩的文件(文件夹)
  91. * @param zipFileName 压缩后的文件名
  92. * @param pwd 压缩密码
  93. * @return 成功-File 失败-null
  94. * @throws ZipException 2015.09.15 airhead modify 压缩文件为文件夹时,压缩从子目录开始,忽略当前目录
  95. */
  96. public File zipFile(File unzipFile, String zipFileName, String pwd) throws ZipException {
  97. //文件不存在时不压缩
  98. if (!unzipFile.exists()) {
  99. return null;
  100. }
  101. ZipParameters parameters = new ZipParameters();
  102. parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
  103. parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
  104. if (!StringUtil.isEmpty(pwd)) {
  105. parameters.setEncryptFiles(true);
  106. parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
  107. parameters.setPassword(pwd.toCharArray());
  108. }
  109. File file = new File(zipFileName);
  110. if (!file.exists()) {
  111. file.getParentFile().mkdirs();
  112. }
  113. ZipFile zipFile = new ZipFile(zipFileName);
  114. if (unzipFile.isDirectory()) {
  115. // zipFile.addFolder(unzipFile, parameters);
  116. File[] files = unzipFile.listFiles();
  117. for (int i = 0; i < files.length; i++) {
  118. if (files[i].isDirectory()) {
  119. zipFile.addFolder(files[i], parameters);
  120. } else {
  121. zipFile.addFile(files[i], parameters);
  122. }
  123. }
  124. } else {
  125. zipFile.addFile(unzipFile, parameters);
  126. }
  127. return new File(zipFileName);
  128. }
  129. /**
  130. * @param zipFile 需要解压的文件名
  131. * @param unzipDirectory 解压文件路径
  132. * @return 成功-File 失败-null
  133. * @throws ZipException
  134. */
  135. public static File unzipFile(File zipFile, String unzipDirectory) throws ZipException {
  136. return unzipFile(zipFile, unzipDirectory, null);
  137. }
  138. /**
  139. * @param zipFile 需要解压的文件名
  140. * @param unzipDirectory 解压文件路径
  141. * @param pwd 解压密码
  142. * @return 成功-File 失败-null
  143. * @throws ZipException
  144. */
  145. public static File unzipFile(File zipFile, String unzipDirectory, String pwd) throws ZipException {
  146. ZipFile zFile = new ZipFile(zipFile);
  147. zFile.setFileNameCharset("GBK");
  148. if (!zFile.isValidZipFile()) {
  149. throw new ZipException("无效的压缩文件.");
  150. }
  151. if (zFile.isEncrypted()) {
  152. zFile.setPassword(pwd.toCharArray());
  153. }
  154. zFile.extractAll(unzipDirectory);
  155. return new File(unzipDirectory);
  156. }
  157. }