JAVA实现压缩/解压缩zip文件

转载 2012年03月21日 12:21:40

转载自:http://orz.iteye.com/blog/110842

Java代码  收藏代码
  1. import java.io.BufferedInputStream;  
  2. import java.io.BufferedOutputStream;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.util.ArrayList;  
  10. import java.util.Enumeration;  
  11. import java.util.List;  
  12. import java.util.zip.ZipEntry;  
  13. import java.util.zip.ZipFile;  
  14. import java.util.zip.ZipOutputStream;  
  15.   
  16. public class ZipToFile {  
  17.       
  18.     public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名  
  19.     public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹  
  20.     public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录  
  21.     public static final int BUFFER = 1024 ;//缓存大小  
  22.       
  23.     /** 
  24.     * zip压缩功能. 
  25.     * 压缩baseDir(文件夹目录)下所有文件,包括子目录 
  26.     * @throws Exception 
  27.     */  
  28.     public static void zipFile(String baseDir,String fileName) throws Exception{  
  29.         List fileList=getSubFiles(new File(baseDir));  
  30.         ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));  
  31.         ZipEntry ze=null;  
  32.         byte[] buf=new byte[BUFFER];  
  33.         int readLen=0;  
  34.         for(int i = 0; i <fileList.size(); i++) {  
  35.             File f=(File)fileList.get(i);  
  36.             ze=new ZipEntry(getAbsFileName(baseDir, f));  
  37.             ze.setSize(f.length());  
  38.             ze.setTime(f.lastModified());     
  39.             zos.putNextEntry(ze);  
  40.             InputStream is=new BufferedInputStream(new FileInputStream(f));  
  41.             while ((readLen=is.read(buf, 0, BUFFER))!=-1) {  
  42.                 zos.write(buf, 0, readLen);  
  43.             }  
  44.             is.close();  
  45.         }  
  46.         zos.close();  
  47.     }  
  48.       
  49.     /** 
  50.     * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径. 
  51.     * @param baseDir java.lang.String 根目录 
  52.     * @param realFileName java.io.File 实际的文件名 
  53.     * @return 相对文件名 
  54.     */  
  55.     private static String getAbsFileName(String baseDir, File realFileName){  
  56.         File real=realFileName;  
  57.         File base=new File(baseDir);  
  58.         String ret=real.getName();  
  59.         while (true) {  
  60.             real=real.getParentFile();  
  61.             if(real==null)   
  62.                 break;  
  63.             if(real.equals(base))   
  64.                 break;  
  65.             else  
  66.                 ret=real.getName()+"/"+ret;  
  67.         }  
  68.         return ret;  
  69.     }  
  70.       
  71.     /** 
  72.     * 取得指定目录下的所有文件列表,包括子目录. 
  73.     * @param baseDir File 指定的目录 
  74.     * @return 包含java.io.File的List 
  75.     */  
  76.     private static List getSubFiles(File baseDir){  
  77.         List ret=new ArrayList();  
  78.         File[] tmp=baseDir.listFiles();  
  79.         for (int i = 0; i <tmp.length; i++) {  
  80.             if(tmp[i].isFile())  
  81.                 ret.add(tmp[i]);  
  82.             if(tmp[i].isDirectory())  
  83.                 ret.addAll(getSubFiles(tmp[i]));  
  84.         }  
  85.         return ret;  
  86.     }  
  87.       
  88.     /** 
  89.     * 解压缩功能. 
  90.     * 将ZIP_FILENAME文件解压到ZIP_DIR目录下. 
  91.     * @throws Exception 
  92.     */  
  93.     public static void upZipFile() throws Exception{  
  94.         ZipFile zfile=new ZipFile(ZIP_FILENAME);  
  95.         Enumeration zList=zfile.entries();  
  96.         ZipEntry ze=null;  
  97.         byte[] buf=new byte[1024];  
  98.         while(zList.hasMoreElements()){  
  99.             ze=(ZipEntry)zList.nextElement();         
  100.             if(ze.isDirectory()){  
  101.                 File f=new File(ZIP_DIR+ze.getName());  
  102.                 f.mkdir();  
  103.                 continue;  
  104.             }  
  105.             OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));  
  106.             InputStream is=new BufferedInputStream(zfile.getInputStream(ze));  
  107.             int readLen=0;  
  108.             while ((readLen=is.read(buf, 01024))!=-1) {  
  109.                 os.write(buf, 0, readLen);  
  110.             }  
  111.             is.close();  
  112.             os.close();   
  113.         }  
  114.         zfile.close();  
  115.     }  
  116.   
  117.     /** 
  118.     * 给定根目录,返回一个相对路径所对应的实际文件名. 
  119.     * @param baseDir 指定根目录 
  120.     * @param absFileName 相对路径名,来自于ZipEntry中的name 
  121.     * @return java.io.File 实际的文件 
  122.     */  
  123.     public static File getRealFileName(String baseDir, String absFileName){  
  124.         String[] dirs=absFileName.split("/");  
  125.         File ret=new File(baseDir);  
  126.         if(dirs.length>1){  
  127.             for (int i = 0; i < dirs.length-1;i++) {  
  128.                 ret=new File(ret, dirs[i]);  
  129.             }  
  130.             if(!ret.exists())  
  131.                 ret.mkdirs();  
  132.             ret=new File(ret, dirs[dirs.length-1]);  
  133.             return ret;  
  134.         }  
  135.         return ret;  
  136.     }  
  137.   
  138. }  


不过上面存在中文问题 
是因为java.util.zip下的格式转换有问题 
将 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipOutputStream; 
改成 
import org.apache.tools.zip.*; 
即可! 
apache里修正了这一现象。

相关文章推荐

Android中用Java代码实现zip文件解压缩(二)

[代码] DirTraversal.javapackage com.once; import java.io.File; import java.util.ArrayList; import...
  • zx4321
  • zx4321
  • 2012年07月03日 17:16
  • 1088

java 实现解压缩文件(ZIP/rar)

在项目中有的时候会需要将上传的wen'jian

关于java解压缩文件(rar或者zip)的实现示例

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; impor...

Android中用Java代码实现zip文件解压缩

如果需要下载的文件有很多是中文名的,解压时有中文名的文件出现乱码,试了很多方法不能解决问题。据说有一个Java插件包,用这个插件包可以解决中文名乱码的问题,但不知解压的文件是否要用它提供的类压缩后的文...
  • zx4321
  • zx4321
  • 2012年07月03日 16:52
  • 12232

Java实现Zip压缩/解压缩目录中的所有文件

Java实现zip解压缩目录中的所有文件 import java.io.*; 02 import java.util.*; 03 import java.util.zip.*; ...

java实现对rar文件和zip文件的解压缩

java实现对rar文件和zip文件的解压缩 一.对zip文件的解压缩 1.1 使用ZIP4J实现 zip4j官方说明: Create, Add, Extract, Update, R...

CompressFile工具类使用,zip和rar文件解压缩与打包操作Java源代码

zip文件解压缩和打包是编写代码时的常用操作,具体代码如下,各位可以参考一下 package com.wfs.file; import java.io.File; import java....

java解压缩zip文件

/*  提供zip文件的解压缩接口:  AdapterZipFile:    输入:zipFileName(zip文件的绝对路径),outputDirectory(zip文件解压缩后的存放路径)...

java生成zip文件打包操作代码(包括解压缩)

public class ZipTools {              public static final String ZIP_FILENAME = "";  //需要解压缩的文件名     ...

Java Api解压缩Zip文件(一)

//原文地址:http://coderdream.iteye.com/blog/246589 首先我们实现最简单的解压缩zip文件,该zip文件中不包含文件夹,也不含中文名。 import j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA实现压缩/解压缩zip文件
举报原因:
原因补充:

(最多只允许输入30个字)