`
and4walker
  • 浏览: 556444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多
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里修正了这一现象。
分享到:
评论
6 楼 hanmiao 2013-11-18  
另外,你的解压方法的方法名的定义改下吧,叫unzipFile(String zipFileName, String zipDir)是不是更加通用些?
5 楼 hanmiao 2013-11-18  
快乐向日葵 写道
cherryzhu 写道
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。
你说的这个问题确实存在的!
你光承认问题存在,就动动手把那個错误的地方修正下撒,我帮你修改之后的 getRealFileName() 方法如下:
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();
			}
		}
		return new File(ret, dirs[dirs.length-1]);
	}

4 楼 快乐向日葵 2012-05-03  
cherryzhu 写道
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。


你说的这个问题确实存在的!
3 楼 悬空90 2011-12-13  
好东西   呵呵
2 楼 cherryzhu 2011-10-19  
你好,我使用这个方法的时候发现了一个错误
在getRealFileName这个方法中,应该把ret=new File(ret, dirs[dirs.length-1]);也放到外到那个return ret;之前。
1 楼 lihy328 2008-05-19  

相关推荐

Global site tag (gtag.js) - Google Analytics