请选择 进入手机版 | 继续访问电脑版
设为首页 收藏本站
开启辅助访问 切换到宽版

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

切换风格 立即注册 找回密码

Java教程网

新浪微博达人勋

2973

积分

837

帖子

686

贡献

Rank: 6Rank: 6

积分
2973

社区QQ达人

发表于 2017-2-16 19:29:14 | 显示全部楼层 |阅读模式
用过Java做压缩或解压的都知道,jdk提供的zip只能按UTF-8格式处理,所有jdk提供的zip不能支持中文文件名采用Apache的zip包解决中文文件名问题(依赖 ant-1.9.6.jar)

  1. package cn.tzz.zip;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.util.Enumeration;

  11. import org.apache.tools.zip.ZipEntry;
  12. import org.apache.tools.zip.ZipFile;
  13. import org.apache.tools.zip.ZipOutputStream;

  14. /**
  15. * ZIP工具包(支持中文)
  16. * 依赖:ant-1.9.6.jar
  17. */
  18. public class CHZipUtils {

  19.         /**使用GBK编码可以避免压缩中文文件名乱码*/
  20.         private static final String CHINESE_CHARSET = "GBK";
  21.         /**文件读取缓冲区大小*/
  22.         private static final int CACHE_SIZE = 1024;

  23.         /**
  24.          * 压缩文件
  25.          * @param sourceFolder 压缩文件夹
  26.          * @param zipFilePath 压缩文件输出路径
  27.          */
  28.         public static void zip(String sourceFolder, String zipFilePath) {
  29.                 OutputStream os = null;
  30.                 BufferedOutputStream bos = null;
  31.                 ZipOutputStream zos = null;
  32.                 try {
  33.                         os = new FileOutputStream(zipFilePath);
  34.                         bos = new BufferedOutputStream(os);
  35.                         zos = new ZipOutputStream(bos);
  36.                         // 解决中文文件名乱码
  37.                         zos.setEncoding(CHINESE_CHARSET);
  38.                         File file = new File(sourceFolder);
  39.                         String basePath = null;
  40.                         if (file.isDirectory()) {//压缩文件夹
  41.                                 basePath = file.getPath();
  42.                         } else {
  43.                                 basePath = file.getParent();
  44.                         }
  45.                         zipFile(file, basePath, zos);
  46.                        
  47.                 } catch (Exception e) {
  48.                         e.printStackTrace();
  49.                 } finally{
  50.                         try {
  51.                                 if (zos != null) {
  52.                                         zos.closeEntry();
  53.                                         zos.close();
  54.                                 }
  55.                                 if (bos != null) {
  56.                                         bos.close();
  57.                                 }
  58.                                 if (os != null) {
  59.                                         os.close();
  60.                                 }
  61.                         } catch (IOException e) {
  62.                                 e.printStackTrace();
  63.                         }
  64.                 }
  65.         }

  66.         /**
  67.          * 递归压缩文件
  68.          * @param parentFile
  69.          * @param basePath
  70.          * @param zos
  71.          * @throws Exception
  72.          */
  73.         private static void zipFile(File parentFile, String basePath, ZipOutputStream zos) throws Exception {
  74.                 File[] files = new File[0];
  75.                 if (parentFile.isDirectory()) {
  76.                         files = parentFile.listFiles();
  77.                 } else {
  78.                         files = new File[1];
  79.                         files[0] = parentFile;
  80.                 }
  81.                 String pathName;
  82.                 InputStream is;
  83.                 BufferedInputStream bis;
  84.                 byte[] cache = new byte[CACHE_SIZE];
  85.                 for (File file : files) {
  86.                         if (file.isDirectory()) {
  87.                                 pathName = file.getPath().substring(basePath.length() + 1) + File.separator;
  88.                                 zos.putNextEntry(new ZipEntry(pathName));
  89.                                 zipFile(file, basePath, zos);
  90.                         } else {
  91.                                 pathName = file.getPath().substring(basePath.length() + 1);
  92.                                 is = new FileInputStream(file);
  93.                                 bis = new BufferedInputStream(is);
  94.                                 zos.putNextEntry(new ZipEntry(pathName));
  95.                                 int nRead = 0;
  96.                                 while ((nRead = bis.read(cache, 0, CACHE_SIZE)) != -1) {
  97.                                         zos.write(cache, 0, nRead);
  98.                                 }
  99.                                 bis.close();
  100.                                 is.close();
  101.                         }
  102.                 }
  103.         }

  104.         /**
  105.          * 解压压缩包
  106.          * @param zipFilePath 压缩文件路径
  107.          * @param destDir 解压目录
  108.          */
  109.         public static void unZip(String zipFilePath, String destDir) {
  110.                 ZipFile zipFile = null;
  111.                 try {
  112.                         BufferedInputStream bis = null;
  113.                         FileOutputStream fos = null;
  114.                         BufferedOutputStream bos = null;
  115.                         zipFile = new ZipFile(zipFilePath, CHINESE_CHARSET);
  116.                         Enumeration<ZipEntry> zipEntries = zipFile.getEntries();
  117.                         File file, parentFile;
  118.                         ZipEntry entry;
  119.                         byte[] cache = new byte[CACHE_SIZE];
  120.                         while (zipEntries.hasMoreElements()) {
  121.                                 entry = (ZipEntry) zipEntries.nextElement();
  122.                                 if (entry.isDirectory()) {
  123.                                         new File(destDir + entry.getName()).mkdirs();
  124.                                         continue;
  125.                                 }
  126.                                 bis = new BufferedInputStream(zipFile.getInputStream(entry));
  127.                                 file = new File(destDir + entry.getName());
  128.                                 parentFile = file.getParentFile();
  129.                                 if (parentFile != null && (!parentFile.exists())) {
  130.                                         parentFile.mkdirs();
  131.                                 }
  132.                                 fos = new FileOutputStream(file);
  133.                                 bos = new BufferedOutputStream(fos, CACHE_SIZE);
  134.                                 int readIndex = 0;
  135.                                 while ((readIndex = bis.read(cache, 0, CACHE_SIZE)) != -1) {
  136.                                         fos.write(cache, 0, readIndex);
  137.                                 }
  138.                                 bos.flush();
  139.                                 bos.close();
  140.                                 fos.close();
  141.                                 bis.close();
  142.                         }
  143.                 } catch (IOException e) {
  144.                         e.printStackTrace();
  145.                 }finally{
  146.                         try {
  147.                                 zipFile.close();
  148.                         } catch (IOException e) {
  149.                                 e.printStackTrace();
  150.                         }
  151.                 }
  152.         }

  153.         public static void main(String[] args) throws Exception {
  154. //                String sourceFolder = "D:/test/1.txt";
  155. //                String sourceFolder = "D:/test/中文名.txt";
  156.                 String sourceFolder = "D:/test/cms";
  157.                 String zipFilePath = "D:/test/zip/压缩文件.zip";
  158.                 String destDir = "D:/test/zip/";
  159.                 CHZipUtils.zip(sourceFolder, zipFilePath);
  160. //                CHZipUtils.unZip(zipFilePath, destDir);
  161.                 System.out.println("********执行成功**********");
  162.         }

  163. }
复制代码



来自群组: java开发组

新浪微博达人勋

6649

积分

1660

帖子

1663

贡献

Rank: 8Rank: 8

积分
6649

社区QQ达人

发表于 2017-2-16 19:29:34 | 显示全部楼层
1v1飘过

新浪微博达人勋

2854

积分

715

帖子

713

贡献

Rank: 6Rank: 6

积分
2854

社区QQ达人

发表于 2017-2-24 12:25:24 | 显示全部楼层
支持楼主,用户楼主,楼主英明呀!!!

新浪微博达人勋

2777

积分

694

帖子

694

贡献

Rank: 6Rank: 6

积分
2777

社区QQ达人

发表于 2017-2-26 13:32:48 | 显示全部楼层
传说中的沙发???哇卡卡

新浪微博达人勋

2968

积分

742

帖子

742

贡献

Rank: 6Rank: 6

积分
2968
发表于 2017-2-27 09:31:31 | 显示全部楼层
支持,赞一个

新浪微博达人勋

6988

积分

1767

帖子

1726

贡献

Rank: 8Rank: 8

积分
6988

社区QQ达人最佳新人活跃会员热心会员

发表于 2017-3-1 13:05:23 | 显示全部楼层
广告位,,坐下看看

新浪微博达人勋

2929

积分

732

帖子

732

贡献

Rank: 6Rank: 6

积分
2929
发表于 2017-3-2 07:53:49 | 显示全部楼层
撸过

新浪微博达人勋

3007

积分

783

帖子

738

贡献

Rank: 8Rank: 8

积分
3007
发表于 2017-3-2 13:34:33 | 显示全部楼层
确实不错,顶先

新浪微博达人勋

6476

积分

1619

帖子

1619

贡献

Rank: 8Rank: 8

积分
6476
发表于 2017-3-3 15:06:49 | 显示全部楼层
高手云集 果断围观

新浪微博达人勋

7431

积分

1941

帖子

1806

贡献

Rank: 8Rank: 8

积分
7431

社区QQ达人最佳新人活跃会员热心会员灌水之王突出贡献

发表于 2017-3-6 20:13:11 | 显示全部楼层
支持,赞一个
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋|手机版|Archiver|Java教程网    

GMT+8, 2019-5-27 19:00 , Processed in 0.328125 second(s), 44 queries .

Powered by Discuz X3.2

© 2001-2013 JAVA教程网

快速回复 返回顶部 返回列表