`

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

阅读更多
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, 0, 1024))!=-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.}  
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipToFile {
	
	public static final String ZIP_FILENAME	= "C:\\XJPDA.zip";//需要解压缩的文件名
	public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹
	public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录
	public static final int BUFFER = 1024 ;//缓存大小
	
	/**
	* zip压缩功能.
	* 压缩baseDir(文件夹目录)下所有文件,包括子目录
	* @throws Exception
	*/
	public static void zipFile(String baseDir,String fileName) throws Exception{
		List fileList=getSubFiles(new File(baseDir));
		ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
		ZipEntry ze=null;
		byte[] buf=new byte[BUFFER];
		int readLen=0;
		for(int i = 0; i <fileList.size(); i++) {
			File f=(File)fileList.get(i);
			ze=new ZipEntry(getAbsFileName(baseDir, f));
			ze.setSize(f.length());
			ze.setTime(f.lastModified());	
			zos.putNextEntry(ze);
			InputStream is=new BufferedInputStream(new FileInputStream(f));
			while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
				zos.write(buf, 0, readLen);
			}
			is.close();
		}
		zos.close();
	}
	
	/**
	* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
	* @param baseDir java.lang.String 根目录
	* @param realFileName java.io.File 实际的文件名
	* @return 相对文件名
	*/
	private static String getAbsFileName(String baseDir, File realFileName){
		File real=realFileName;
		File base=new File(baseDir);
		String ret=real.getName();
		while (true) {
			real=real.getParentFile();
			if(real==null) 
				break;
			if(real.equals(base)) 
				break;
			else
				ret=real.getName()+"/"+ret;
		}
		return ret;
	}
	
	/**
	* 取得指定目录下的所有文件列表,包括子目录.
	* @param baseDir File 指定的目录
	* @return 包含java.io.File的List
	*/
	private static List getSubFiles(File baseDir){
		List ret=new ArrayList();
		File[] tmp=baseDir.listFiles();
		for (int i = 0; i <tmp.length; i++) {
			if(tmp[i].isFile())
				ret.add(tmp[i]);
			if(tmp[i].isDirectory())
				ret.addAll(getSubFiles(tmp[i]));
		}
		return ret;
	}
	
	/**
	* 解压缩功能.
	* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.
	* @throws Exception
	*/
	public static void upZipFile() throws Exception{
		ZipFile zfile=new ZipFile(ZIP_FILENAME);
		Enumeration zList=zfile.entries();
		ZipEntry ze=null;
		byte[] buf=new byte[1024];
		while(zList.hasMoreElements()){
			ze=(ZipEntry)zList.nextElement();		
			if(ze.isDirectory()){
	            File f=new File(ZIP_DIR+ze.getName());
	            f.mkdir();
				continue;
			}
			OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));
			InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
			int readLen=0;
			while ((readLen=is.read(buf, 0, 1024))!=-1) {
				os.write(buf, 0, readLen);
			}
			is.close();
			os.close();	
		}
		zfile.close();
	}

	/**
	* 给定根目录,返回一个相对路径所对应的实际文件名.
	* @param baseDir 指定根目录
	* @param absFileName 相对路径名,来自于ZipEntry中的name
	* @return java.io.File 实际的文件
	*/
	public static File getRealFileName(String baseDir, String absFileName){
		String[] dirs=absFileName.split("/");
		File ret=new File(baseDir);
		if(dirs.length>1){
			for (int i = 0; i < dirs.length-1;i++) {
				ret=new File(ret, dirs[i]);
			}
			if(!ret.exists())
				ret.mkdirs();
			ret=new File(ret, dirs[dirs.length-1]);
			return ret;
		}
		return ret;
	}

}

不过上面存在中文问题
是因为java.util.zip下的格式转换有问题

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
原文地址:http://orz.iteye.com/blog/110842
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics