关闭

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

标签: javabufferimportfileapachestring
455人阅读 评论(0) 收藏 举报
分类:

转载自: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里修正了这一现象。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2098364次
    • 积分:22818
    • 等级:
    • 排名:第305名
    • 原创:232篇
    • 转载:740篇
    • 译文:1篇
    • 评论:188条
    最新评论