注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

java实现zip压缩文件  

2014-11-28 21:17:41|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
java实现zip压缩文件

2011-10-24 16:49:08|? 分类: java |? 标签: |举报 |字号大中小 订阅

网上查了许久,最后发现三种不错的方法:

1、jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,

出现乱码问题,实现代码如下:

/**
? * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件
? * @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;
? *????? 如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件
? * @param zipFile 最后压缩的文件路径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip
? */
public File doZip(String sourceDir, String zipFilePath)
throws IOException {
? File file = new File(sourceDir);
? File zipFile = new File(zipFilePath);
? ZipOutputStream zos = null;
? try {
?? // 创建写出流操作
?? OutputStream os = new FileOutputStream(zipFile);
?? BufferedOutputStream bos = new BufferedOutputStream(os);
?? zos = new ZipOutputStream(bos);
?? String basePath = null;
?? // 获取目录
?? if(file.isDirectory()) {
??? basePath = file.getPath();
?? }else {
??? basePath = file.getParent();
?? }
?? zipFile(file, basePath, zos);
? }finally {
?? if(zos != null) {
??? zos.closeEntry();
??? zos.close();
?? }
? }
? return zipFile;
}

/**
? * @param source 源文件
? * @param basePath
? * @param zos
? */
private void zipFile(File source, String basePath, ZipOutputStream zos)
throws IOException {
? File[] files = null;
? if (source.isDirectory()) {
?? files = source.listFiles();
? } else {
?? files = new File[1];
?? files[0] = source;
? }
? InputStream is = null;
? String pathName;
? byte[] buf = new byte[1024];
? int length = 0;
? try{
?? for(File file : files) {
??? if(file.isDirectory()) {
???? pathName = file.getPath().substring(basePath.length() + 1) + "/";
???? zos.putNextEntry(new ZipEntry(pathName));
???? zipFile(file, basePath, zos);
??? }else {
???? pathName = file.getPath().substring(basePath.length() + 1);
???? is = new FileInputStream(file);
???? BufferedInputStream bis = new BufferedInputStream(is);
???? zos.putNextEntry(new ZipEntry(pathName));
???? while ((length = bis.read(buf)) > 0) {
????? zos.write(buf, 0, length);
???? }
??? }
?? }
? }finally {
?? if(is != null) {
??? is.close();
?? }
? }

}

2、使用org.apache.tools.zip.ZipOutputStream,代码如下,

Java代码:

  1. package net.szh.zip;??
  2. import java.io.BufferedInputStream;??
  3. import java.io.File;??
  4. import java.io.FileInputStream;??
  5. import java.io.FileOutputStream;??
  6. import java.util.zip.CRC32;??
  7. import java.util.zip.CheckedOutputStream;??
  8. import org.apache.tools.zip.ZipEntry;??
  9. import org.apache.tools.zip.ZipOutputStream;??
  10. public class ZipCompressor {??
  11. static final int BUFFER = 8192;??
  12. private File zipFile;??
  13. public ZipCompressor(String pathName) {??
  14. ??????? zipFile = new File(pathName);??
  15. ??? }??
  16. public void compress(String srcPathName) {??
  17. ??????? File file = new File(srcPathName);??
  18. if (!file.exists())??
  19. throw new RuntimeException(srcPathName + "不存在!");??
  20. try {??
  21. ??????????? FileOutputStream fileOutputStream = new FileOutputStream(zipFile);??
  22. ??????????? CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,??
  23. new CRC32());??
  24. ??????????? ZipOutputStream out = new ZipOutputStream(cos);??
  25. ??????????? String basedir = "";??
  26. ??????????? compress(file, out, basedir);??
  27. ??????????? out.close();??
  28. ??????? } catch (Exception e) {??
  29. throw new RuntimeException(e);??
  30. ??????? }??
  31. ??? }??
  32. private void compress(File file, ZipOutputStream out, String basedir) {??
  33. /* 判断是目录还是文件 */
  34. if (file.isDirectory()) {??
  35. ??????????? System.out.println("压缩:" + basedir + file.getName());??
  36. this.compressDirectory(file, out, basedir);??
  37. ??????? } else {??
  38. ??????????? System.out.println("压缩:" + basedir + file.getName());??
  39. this.compressFile(file, out, basedir);??
  40. ??????? }??
  41. ??? }??
  42. /** 压缩一个目录 */
  43. private void compressDirectory(File dir, ZipOutputStream out, String basedir) {??
  44. if (!dir.exists())??
  45. return;??
  46. ??????? File[] files = dir.listFiles();??
  47. for (int i = 0; i < files.length; i++) {??
  48. /* 递归 */
  49. ??????????? compress(files[i], out, basedir + dir.getName() + "/");??
  50. ??????? }??
  51. ??? }??
  52. /** 压缩一个文件 */
  53. private void compressFile(File file, ZipOutputStream out, String basedir) {??
  54. if (!file.exists()) {??
  55. return;??
  56. ??????? }??
  57. try {??
  58. ??????????? BufferedInputStream bis = new BufferedInputStream(??
  59. new FileInputStream(file));??
  60. ??????????? ZipEntry entry = new ZipEntry(basedir + file.getName());??
  61. ??????????? out.putNextEntry(entry);??
  62. int count;??
  63. byte data[] = new byte[BUFFER];??
  64. while ((count = bis.read(data, 0, BUFFER)) != -1) {??
  65. ??????????????? out.write(data, 0, count);??
  66. ??????????? }??
  67. ??????????? bis.close();??
  68. ??????? } catch (Exception e) {??
  69. throw new RuntimeException(e);??
  70. ??????? }??
  71. ??? }??
  72. }

3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。

Java代码

  1. package net.szh.zip;??
  2. import java.io.File;??
  3. import org.apache.tools.ant.Project;??
  4. import org.apache.tools.ant.taskdefs.Zip;??
  5. import org.apache.tools.ant.types.FileSet;??
  6. public class ZipCompressorByAnt {??
  7. private File zipFile;??
  8. public ZipCompressorByAnt(String pathName) {??
  9. ??????? zipFile = new File(pathName);??
  10. ??? }??
  11. public void compress(String srcPathName) {??
  12. ??????? File srcdir = new File(srcPathName);??
  13. if (!srcdir.exists())??
  14. throw new RuntimeException(srcPathName + "不存在!");??
  15. ??????? Project prj = new Project();??
  16. ??????? Zip zip = new Zip();??
  17. ??????? zip.setProject(prj);??
  18. ??????? zip.setDestFile(zipFile);??
  19. ??????? FileSet fileSet = new FileSet();??
  20. ??????? fileSet.setProject(prj);??
  21. ??????? fileSet.setDir(srcdir);??
  22. //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");
  23. //fileSet.setExcludes(...); 排除哪些文件或文件夹
  24. ??????? zip.addFileset(fileSet);??
  25. ??????? zip.execute();??
  26. ??? }??
  27. }?
?
测试一下

Java代码

  1. package net.szh.zip;??
  2. public class TestZip {??
  3. public static void main(String[] args) {??
  4. ??????? ZipCompressor zc = new? ZipCompressor("E:\\szhzip.zip");??
  5. ??????? zc.compress("E:\\test");??
  6. ??????? ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");??
  7. ??????? zca.compress("E:\\test");??
  8. ??? }??
  9. }?
  评论这张
 
阅读(268)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017