当前位置:   article > 正文

Java实现压缩和解压zip和jar_zip压缩jar

zip压缩jar
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.util.jar.JarOutputStream;
  9. import java.util.zip.ZipEntry;
  10. import java.util.zip.ZipException;
  11. import java.util.zip.ZipFile;
  12. import java.util.zip.ZipInputStream;
  13. import java.util.zip.ZipOutputStream;
  14. /**
  15. * 压缩类型枚举
  16. *
  17. * @author Log
  18. *
  19. */
  20. enum CompressType {
  21. // GZIP是用于UNIX系统的文件压缩,在Linux中经常会使用到*.gz的文件,就是GZIP格式
  22. ZIP, JAR, GZIP
  23. }
  24. public class ZipUtils {
  25. public static void main(String[] args) {
  26. // compress(CompressType.ZIP);
  27. unZip("压缩.zip", "压缩后");
  28. // unZip("压缩.jar", "压缩后jar");
  29. }
  30. public static void compress(CompressType type) {
  31. if (type == CompressType.ZIP) {
  32. zip("压缩", "压缩.zip", CompressType.ZIP);
  33. } else if (type == CompressType.JAR) {
  34. zip("压缩", "压缩.jar", CompressType.JAR);
  35. }
  36. }
  37. public static void zip(String inputFile, String outputFile, CompressType type) {
  38. zip(new File(inputFile), new File(outputFile), type);
  39. }
  40. /**
  41. * 初始化压缩包信息并开始进行压缩
  42. *
  43. * @param inputFile 需要压缩的文件或文件夹
  44. * @param outputFile 压缩后的文件
  45. * @param type 压缩类型
  46. */
  47. public static void zip(File inputFile, File outputFile, CompressType type) {
  48. ZipOutputStream zos = null;
  49. try {
  50. if (type == CompressType.ZIP) {
  51. zos = new ZipOutputStream(new FileOutputStream(outputFile));
  52. } else if (type == CompressType.JAR) {
  53. zos = new JarOutputStream(new FileOutputStream(outputFile));
  54. } else {
  55. zos = new ZipOutputStream(new FileOutputStream(outputFile));
  56. }
  57. // 设置压缩包注释
  58. zos.setComment("From Log");
  59. zipFile(zos, inputFile, null);
  60. System.err.println("压缩完成!");
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. System.err.println("压缩失败!");
  64. } finally {
  65. if (zos != null) {
  66. try {
  67. zos.close();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. }
  74. /**
  75. * 如果是单个文件,那么就直接进行压缩。如果是文件夹,那么递归压缩所有文件夹里的文件
  76. *
  77. * @param zos 压缩输出流
  78. * @param inputFile 需要压缩的文件
  79. * @param path 需要压缩的文件在压缩包里的路径
  80. */
  81. public static void zipFile(ZipOutputStream zos, File inputFile, String path) {
  82. if (inputFile.isDirectory()) {
  83. // 记录压缩包中文件的全路径
  84. String p = null;
  85. File[] fileList = inputFile.listFiles();
  86. for (int i = 0; i < fileList.length; i++) {
  87. File file = fileList[i];
  88. // 如果路径为空,说明是根目录
  89. if (path == null || path.isEmpty()) {
  90. p = file.getName();
  91. } else {
  92. p = path + File.separator + file.getName();
  93. }
  94. // 打印路径
  95. System.out.println(p);
  96. // 如果是目录递归调用,直到遇到文件为止
  97. zipFile(zos, file, p);
  98. }
  99. } else {
  100. zipSingleFile(zos, inputFile, path);
  101. }
  102. }
  103. /**
  104. * 压缩单个文件到指定压缩流里
  105. *
  106. * @param zos 压缩输出流
  107. * @param inputFile 需要压缩的文件
  108. * @param path 需要压缩的文件在压缩包里的路径
  109. * @throws FileNotFoundException
  110. */
  111. public static void zipSingleFile(ZipOutputStream zos, File inputFile, String path) {
  112. try {
  113. InputStream in = new FileInputStream(inputFile);
  114. zos.putNextEntry(new ZipEntry(path));
  115. write(in, zos);
  116. } catch (IOException e) {
  117. e.printStackTrace();
  118. }
  119. }
  120. /**
  121. * 解压压缩包到指定目录
  122. *
  123. * @param inputFile
  124. * @param outputFile
  125. */
  126. public static void unZip(String inputFile, String outputFile) {
  127. unZip(new File(inputFile), new File(outputFile));
  128. }
  129. /**
  130. * 解压压缩包到指定目录
  131. *
  132. * @param inputFile
  133. * @param outputFile
  134. */
  135. public static void unZip(File inputFile, File outputFile) {
  136. if (!outputFile.exists()) {
  137. outputFile.mkdirs();
  138. }
  139. ZipFile zipFile = null;
  140. ZipInputStream zipInput = null;
  141. ZipEntry entry = null;
  142. OutputStream output = null;
  143. InputStream input = null;
  144. File file = null;
  145. try {
  146. zipFile = new ZipFile(inputFile);
  147. zipInput = new ZipInputStream(new FileInputStream(inputFile));
  148. String path = outputFile.getAbsolutePath() + File.separator;
  149. while ((entry = zipInput.getNextEntry()) != null) {
  150. // 从压缩文件里获取指定已压缩文件的输入流
  151. input = zipFile.getInputStream(entry);
  152. // 拼装压缩后真实文件路径
  153. String fileName = path + entry.getName();
  154. System.out.println(fileName);
  155. // 创建文件缺失的目录(不然会报异常:找不到指定文件)
  156. file = new File(fileName.substring(0, fileName.lastIndexOf(File.separator)));
  157. file.mkdirs();
  158. // 创建文件输出流
  159. output = new FileOutputStream(fileName);
  160. // 写出解压后文件数据
  161. write(input, output);
  162. output.close();
  163. }
  164. } catch (ZipException e) {
  165. e.printStackTrace();
  166. } catch (IOException e) {
  167. e.printStackTrace();
  168. } finally {
  169. try {
  170. if (output != null) {
  171. output.close();
  172. }
  173. if (zipInput != null) {
  174. zipInput.close();
  175. }
  176. } catch (IOException e) {
  177. e.printStackTrace();
  178. }
  179. }
  180. }
  181. /**
  182. * 从输入流写入到输出流的方便方法 【注意】这个函数只会关闭输入流,且读写完成后会调用输出流的flush()函数,但不会关闭输出流!
  183. *
  184. * @param input
  185. * @param output
  186. */
  187. private static void write(InputStream input, OutputStream output) {
  188. int len = -1;
  189. byte[] buff = new byte[1024];
  190. try {
  191. while ((len = input.read(buff)) != -1) {
  192. output.write(buff, 0, len);
  193. }
  194. output.flush();
  195. } catch (IOException e) {
  196. e.printStackTrace();
  197. } finally {
  198. try {
  199. input.close();
  200. } catch (IOException e) {
  201. e.printStackTrace();
  202. }
  203. }
  204. }
  205. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/577455
推荐阅读
相关标签
  

闽ICP备14008679号