1.引言
之前在 压缩与解压1---字符串的压缩与解压(http://www.cnblogs.com/java-pan/archive/2012/05/12/gzip1.html)

中介绍过对字符串的压缩和解压,这个解压和解决用在系统之间大数据传输的时候还是可以大大的减少网络流量的。本节主要本别介绍对单个文件、多个文件的压缩。解压这里就不讲了,解压的话没什么实际意义,因为文件压缩后为zip格式的文件,现在windows系统解压这个格式的文件真是特多了。我个人认为这个压缩文件的功能在以下场景使用就比较合理:比如某运行的系统,在每天或者每周的固定时间会导出一批报表,如果我们不对导出的报表进行压缩,那么磁盘空间会大幅度的增加,如果我们对导出的文件进行压缩,那么磁盘空间的开销就会大大节省。

2.文件压缩的中文问题
中文,一直是个头疼的问题,同样,在这里我们对文件压缩也会出现中文乱码问题。对压缩的文件,如果文件名称是中文,压缩完成后,可以看到压缩包中的文件名称是乱码(文件的内容有中文,压缩后不会出现中文乱码问题),对于这种情况我们只要用ANT中的ant.jar中的类就可以解决此问题。压缩过程中会用到ZipEntry和ZipOutputStream类,如果我采用第一种方式,这样就会出现中文乱码;如果我采用第二种方式,中文乱码问题就可以解决。文件运行的对比效果我会在后面把截图贴出来做一下对比。

第一种方式:

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

以上采用JDK API中自带的类时压缩的文件名会出现中文乱码

第二种方式:

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

以上采用ANT中ant.jar包的类可以解决压缩的文件名的中文乱码问题

3.下载jar包
对于本节我只需要一个jar包,即ant.jar,提供jar包的下载路径如下:

http://files.cnblogs.com/java-pan/jar-ant.rar

4.method&class
ZipEntry:

ZipOutputStream:

5.代码文件

ZipFileUtil.java

[java]view plaincopy
  1. package zip;

  2. import java.io.File;

  3. import java.io.FileInputStream;

  4. import java.io.FileOutputStream;

  5. import java.io.IOException;

  6. /*

  7. * 采用JDK API中自带的类时压缩的文件会出现中文乱码

  8. */

  9. //import java.util.zip.ZipEntry;

  10. //import java.util.zip.ZipOutputStream;

  11. /*

  12. * 采用ANT中ant.jar包的类可以解决中文乱码问题

  13. */

  14. import org.apache.tools.zip.ZipEntry;

  15. import org.apache.tools.zip.ZipOutputStream;

  16. /**

  17. *Module:          ZipFileUtil.java

  18. *Description:    用zip对单个和多个文件进行压缩

  19. *Company:       xxx

  20. *Version:          1.0.0

  21. *Author:           pantp

  22. *Date:              May 24, 2012

  23. */

  24. publicclass ZipFileUtil {

  25. publicstaticvoid main(String[] args) throws Exception {

  26. /*

  27. * 测试单个文件的ZIP压缩

  28. * 指定文件路径可以是绝对路径,也可以是相对路径

  29. */

  30. String file = "src/zip/文件1.txt";

  31. String zipFile1 = "src/zip/单个文件压缩.zip";

  32. boolean flag1 = zipSingleFile(file, zipFile1);

  33. System.out.println("\n**************压缩【单】个文件<author:pantp>******************************\n");

  34. if (flag1) {

  35. System.out.println("单个文件ZIP压缩成功,压缩后文件所在路径为:"+zipFile1);

  36. } else {

  37. System.out.println("单个文件ZIP压缩失败");

  38. }

  39. System.out.println("\n*******************************************************************************");

  40. /*

  41. * 测试多个文件的ZIP压缩

  42. * 指定文件路径可以是绝对路径,也可以是相对路径

  43. */

  44. /*        String files[] = { "src/zip/文件1.txt", "src/zip/file2.txt" };

  45. String zipFile2 = "src/zip/多个文件压缩.zip";

  46. boolean flag2 = zipFiles(files, zipFile2);

  47. System.out.println("\n**************压缩【多】个文件<author:pantp>******************************\n");

  48. if (flag2) {

  49. System.out.println("多个文件ZIP压缩成功,压缩后文件所在路径为:"+zipFile2);

  50. } else {

  51. System.out.println("多个文件ZIP压缩失败");

  52. }

  53. System.out.println("\n*******************************************************************************");

  54. */

  55. }

  56. /**

  57. *<p>

  58. *@param  file 待压缩文件的名称 例如,src/zip/文件1.txt

  59. *@param  zipFile 压缩后文件的名称 例如,src/zip/单个文件压缩.zip

  60. *@return boolean

  61. *@throws :IOException

  62. *@Function: zipSingleFile

  63. *@Description:单个文件的压缩

  64. *@version : v1.0.0

  65. *@author: pantp

  66. *@Date:May 24, 2012

  67. *</p>

  68. *Modification History:

  69. * Date                     Author          Version         Description

  70. * ---------------------------------------------------------------------

  71. * May 24, 2012        pantp           v1.0.0           Create

  72. */

  73. publicstaticboolean zipSingleFile(String file, String zipFile)

  74. throws IOException {

  75. boolean bf = true;

  76. File f = new File(file);

  77. if (!f.exists()) {

  78. System.out.println("文件不存在");

  79. bf = false;

  80. } else {

  81. File ff = new File(zipFile);

  82. if (!f.exists()) {

  83. ff.createNewFile();

  84. }

  85. // 创建文件输入流对象

  86. FileInputStream in = new FileInputStream(file);

  87. // 创建文件输出流对象

  88. FileOutputStream out = new FileOutputStream(zipFile);

  89. // 创建ZIP数据输出流对象

  90. ZipOutputStream zipOut = new ZipOutputStream(out);

  91. // 得到文件名称

  92. String fileName = file.substring(file.lastIndexOf('/') + 1, file.length());

  93. // 创建指向压缩原始文件的入口

  94. ZipEntry entry = new ZipEntry(fileName);

  95. zipOut.putNextEntry(entry);

  96. // 向压缩文件中输出数据

  97. int number = 0;

  98. byte[] buffer = newbyte[512];

  99. while ((number = in.read(buffer)) != -1) {

  100. zipOut.write(buffer, 0, number);

  101. }

  102. zipOut.close();

  103. out.close();

  104. in.close();

  105. }

  106. return bf;

  107. }

  108. /**

  109. *<p>

  110. *@param files    待压缩的文件列表 例如,src/zip/文件1.txt, src/zip/file2.txt

  111. *@param zipfile 压缩后的文件名称 例如,src/zip/多个文件压缩.zip

  112. *@return boolean

  113. *@throws :Exception

  114. *@Function: zipFiles

  115. *@Description:多个文件的ZIP压缩

  116. *@version : v1.0.0

  117. *@author: pantp

  118. *@Date:May 24, 2012

  119. *</p>

  120. *Modification History:

  121. * Date                     Author          Version         Description

  122. * ---------------------------------------------------------------------

  123. * May 24, 2012        pantp           v1.0.0           Create

  124. */

  125. publicstaticboolean zipFiles(String[] files, String zipfile)

  126. throws Exception {

  127. boolean bf = true;

  128. // 根据文件路径构造一个文件实例

  129. File ff = new File(zipfile);

  130. // 判断目前文件是否存在,如果不存在,则新建一个

  131. if (!ff.exists()) {

  132. ff.createNewFile();

  133. }

  134. // 根据文件路径构造一个文件输出流

  135. FileOutputStream out = new FileOutputStream(zipfile);

  136. // 传入文件输出流对象,创建ZIP数据输出流对象

  137. ZipOutputStream zipOut = new ZipOutputStream(out);

  138. // 循环待压缩的文件列表

  139. for (int i = 0; i < files.length; i++) {

  140. File f = new File(files[i]);

  141. if (!f.exists()) {

  142. bf = false;

  143. }

  144. try {

  145. // 创建文件输入流对象

  146. FileInputStream in = new FileInputStream(files[i]);

  147. // 得到当前文件的文件名称

  148. String fileName = files[i].substring(

  149. files[i].lastIndexOf('/') + 1, files[i].length());

  150. // 创建指向压缩原始文件的入口

  151. ZipEntry entry = new ZipEntry(fileName);

  152. zipOut.putNextEntry(entry);

  153. // 向压缩文件中输出数据

  154. int nNumber = 0;

  155. byte[] buffer = newbyte[512];

  156. while ((nNumber = in.read(buffer)) != -1) {

  157. zipOut.write(buffer, 0, nNumber);

  158. }

  159. // 关闭创建的流对象

  160. in.close();

  161. } catch (IOException e) {

  162. e.printStackTrace();

  163. bf = false;

  164. }

  165. }

  166. zipOut.close();

  167. out.close();

  168. return bf;

  169. }

  170. }

6.运行测试
(1)在项目的src的zip目录下新建以下2个测试文件

文件1.txt

file2.txt

(2)运行main方法中单个文件压缩的方法,运行结果如图:

后台日志如下:

生成的zip文件如下:

*(

(3)运行main方法中多个文件压缩的方法,运行结果如图:

后台日志如下:

生成的zip文件如下:

压缩后的文件中不会出现中文乱码问题,打开多个文件压缩.zip文件中的文件1.txt,内容如下:

采用JDK自带的类会出现中文乱码问题,效果如图:

转载于:https://blog.51cto.com/3001448/1206519

压缩与解压2---文件的压缩相关推荐

  1. c++配置并使用bit7z加密压缩或解压7z文件

    本文使用bit7z bit7z is a C++ static library which allows to compress and extract many file archive forma ...

  2. linux图形界面解压rar文件夹,压缩与解压

    出自Linux Wiki 提示:此文已超过 5 年(1880 天)未更新,如发现内容过时或有误,欢迎改进:) 本文介绍Linux环境中处理rar.zip.gz.bz2.tar等常见压缩/归档文件的方法 ...

  3. Linux中压缩和解压(gzip压缩/gunzip解压)(zip压缩/unzip解压)(tar打包解压)

    文章目录 Linux中压缩和解压(gzip压缩/gunzip解压)(zip压缩/unzip解压)(tar打包解压) 一.gzip压缩 / gunzip解压 1.命令 2.注意 3.案例 4.常用 二. ...

  4. Java 压缩与解压zip文件

    一.压缩文件大致可以分为三种:ZIP.JAR.GZ. 压缩流 在日常中经常会使用到像WinRAR或WinZIP这样的压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输. 在JAVA中,为了减 ...

  5. 【Linux】Linux下压缩、解压rar文件

    一.问题 使用tar只能对 tar.zip.tar.gz 进行操作, 无法解压rar文件. 二.安装rar wget http://www.rarlab.com/rar/rarlinux-3.9.2. ...

  6. 解压 *.gz文件 gzip压缩

    压缩文件 gzip file1.txtls -l file1.* -rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz 解压文件 gzip - ...

  7. java如何解压rar文件怎么打开,Java压缩与解压rar文件

    package com.sunz.fileUpload; public class RarToFile { //cmd 压缩与解压缩命令 private static String rarCmd = ...

  8. Java压缩、解压zip文件

    代码: public class ZipUtil {/*** 压缩文件/文件夹**/public static void compress(String srcFilePath, String des ...

  9. 安卓客户端带密码压缩或者解压zip文件

    这个是看的别人的文章,然后改过两行,拿到安卓上来用的 jar下载地址:http://download.csdn.net/detail/qq_24179679/9766252 操作类如下 import ...

  10. 解压 *.gz文件 gzip压缩

    压缩文件 gzip file1.txtls -l file1.* -rw-r--r-- 1 root root 134416 Aug 21 08:08 file1.txt.gz 解压文件 gzip - ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第16期)
  2. SAP SD 信贷管理的操作流程
  3. ORACLE Recyclebin管理及flashback recyclebin中的对象
  4. iOS边练边学--CALayer,非根层隐式动画,钟表练习
  5. 【Henu ACM Round#17 D】Hexagons!
  6. Beetlsql自定义生成entity,mapper,md代码
  7. Hadoop记录-监控几个思路
  8. leetcode 566. Reshape the Matrix | 566. 重塑矩阵(Java)
  9. java中jsp标准动作_JavaBean和jsp标准动作
  10. sentinel卫星_IKONOS卫星 遥感影像解译数据 波段
  11. 【博客项目】—Joi(八)
  12. linux6.8屏幕黑屏,centos6.8笔记本关盖就黑屏怎样设置不黑屏?
  13. 输出华氏温度用java_用JAVA写一个将华氏温度转换成摄氏温度的程序
  14. android - DeviceOwner: Trying to set device owner but device is already provisioned
  15. 爱快云微信连wifi3.1用户前期准备工作
  16. ISP(图像信号处理)之——坏点校正
  17. 一个umi4的项目适配到FireFox60.7.1esr版本上的从头到尾
  18. 转转“拯救世界”的第一步,师从小米换LOGO?
  19. JS使用htef访问html文件,法语TEF考试语法及词汇练习.docx
  20. pip失败——sys.stderr.write(f“ERROR: {exc}“) SyntaxError: invalid syntax

热门文章

  1. 借助Haproxy_exporter实现对MarathonLb的流量和负载实例业务的可用状态监控-续
  2. js map遍历 修改对象里面的值_前端面试之你必须要懂的原生JS
  3. tail -f 命令卡住
  4. 如何c51和mdk共存兼容_如何使用无线技术控制大功率快速充电
  5. linux开机进入不了系统安装软件,揭秘linux系统启动流程,面试官问起来再也不怕了...
  6. sql依据单个字段去重_Java面试之常用SQL
  7. PHP 进程间通信——消息队列(msg_queue)
  8. 外网接口(浏览器接口)调取设备数据,放到数据库里
  9. 关于中缀表达式的计算 和算符优先算法
  10. [CSS备忘] css3零散