java zip 解压缩文件

java.util.zip包实现了zip格式相关的类库,使用ZIP格式压缩和解压缩文件时可以使用该包中的类,但是对于解压缩中文文件名,就会出现乱码,所以可以使用ant中的org.apache.tools.zip包中的类进行解压缩,使用方法和java中的类似

使用ZipoOutputStream可以实现文件压缩,所有写入到ZipOutputStream输出流中的数据,都会被Zip格式压缩。

每个压缩的文件或目录在ZIP文件中对应一个ZipEntry对象,每个ZipEntry都有一个name属性,表示它相对于Zip文件根目录的相对路径,对于目录,路径以‘/’结束,对应文件,路径以文件名结尾。

ZipOutputStream的putNextEntry方法忘Zip文件中添加一个ZipEntry,紧接着写入到该ZipOutputStream流中的数据都被保存在这个ZipEntry中,直到调用ZipOutputStream的closeEntry方法。

ZipFile表示一个Zip文件,它的entries方法能获取Zip文件中所有的ZipEntry集合。

ZipEntry的isDirectory方法判断该ZipEntry是否代表一个目录。getInputStream方法获取ZipEntry的输入流


package com.lkt.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * Zip压缩和解压文件或目录
 * @author Administrator
 *
 */
public class ZipTest {
	
	public static void zipFile(String baseDirName,String fileName,String targetFileName){
		if(baseDirName==null){
			System.out.println("压缩失败,根目录不存在:"+baseDirName);
			return ;
		}
		File baseDir=new File(baseDirName);
		if(!baseDir.exists()||(!baseDir.isDirectory())){
			System.out.println("压缩失败,根目录不存在:"+baseDirName);
			return ;
		}
		String baseDirPath=baseDir.getPath();
		System.out.println(baseDirPath);
		//目标文件
		File targetFile=new File(targetFileName);
		try {
			//创建一个zip输出流来压缩数据并写入到zip文件
			ZipOutputStream out=new ZipOutputStream(new FileOutputStream(targetFile));
			if(fileName.equals("*")){
				dirToZip(baseDirPath, baseDir, out);
			}else{
				File file=new File(baseDir,fileName);
				if(file.isFile()){
					fileToZip(baseDirPath, file, out);
				}else{
					dirToZip(baseDirPath, file, out);
				}
			}
			out.close();
			System.out.println("压缩文件成功,目标文件名:"+targetFileName);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	/**
	 * 解压ZIP文件,将ZIP文件的内容解压到targetDir目录下
	 * @param zipFileName
	 * @param targetBaseDirName
	 */
	public static void upzipFile(String zipFileName,String targetBaseDirName){
		if(!targetBaseDirName.endsWith(File.separator)){
			targetBaseDirName+=File.separator;
		}
		try {
			//根据ZIP文件创建zipfile对象
			ZipFile zipFile=new ZipFile(zipFileName);
			ZipEntry entry=null;
			String entryName=null;
			String targetFileName=null;
			byte[] buffer=new byte[4096];
			int bytes_read;
			//获取ZIP文件里所有的entry
			Enumeration entrys=zipFile.getEntries();
			while(entrys.hasMoreElements()){
				entry=(ZipEntry)entrys.nextElement();
				entryName=entry.getName();
				targetFileName=targetBaseDirName+entryName;
				if(entry.isDirectory()){
					new File(targetFileName).mkdirs();
					continue;
				}else{
					new File(targetFileName).getParentFile().mkdirs();
				}
				File targetFile=new File(targetFileName);
				System.out.println("创建文件:"+targetFile.getAbsolutePath());
				FileOutputStream os=new FileOutputStream(targetFile);
				InputStream is=zipFile.getInputStream(entry);
				while((bytes_read=is.read(buffer))!=-1){
					os.write(buffer, 0, bytes_read);
				}
				os.close();
				is.close();
			}
			System.out.println("解压缩文件成功");
		} catch (Exception e) {
			System.out.println("解压缩文件失败");
		}
	}
	
	/**
	 * 将目录压缩到ZIP输出流
	 * @param baseDirPath
	 * @param dir
	 * @param out
	 */
	private static void dirToZip(String baseDirPath,File dir,ZipOutputStream out){
		if(dir.isDirectory()){
			File[] files=dir.listFiles();
			if(files.length==0){
				ZipEntry entry=new ZipEntry(getEntryName(baseDirPath, dir));
				try {
					out.putNextEntry(entry);
					out.closeEntry();
				} catch (Exception e) {
				}
				return ;
			}
			for (int i = 0; i < files.length; i++) {
				if(files[i].isFile()){
					fileToZip(baseDirPath, files[i], out);
				}else{
					dirToZip(baseDirPath, files[i], out);
				}
			}
		}
	}
	
	
	//将文件压缩到ZIP输出流
	private static void fileToZip(String baseDirPath,File file,ZipOutputStream out){
		FileInputStream in=null;
		ZipEntry entry=null;
		//创建复制缓冲区
		byte[] buffer=new byte[4096];
		int bytes_read;
		if(file.isFile()){
			try {
				//创建一个文件输入流
				in =new FileInputStream(file);
				entry=new ZipEntry(getEntryName(baseDirPath, file));
				//存储项信息到压缩文件
				out.putNextEntry(entry);
				//复制字节到压缩文件
				while((bytes_read=in.read(buffer))!=-1){
					out.write(buffer, 0, bytes_read);
				}
				out.closeEntry();
				in.close();
				System.out.println("添加文件:"+file.getAbsolutePath()+"被添加到ZIP文件中");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	//获取待压缩文件在ZIP文件中的entry的名字,即相对于根目录的相对路径名
	private static String getEntryName(String baseDirPath,File file){
		if(!baseDirPath.endsWith(File.separator)){
			baseDirPath+=File.separator;
		}
		String filePath=file.getAbsolutePath();
		if(file.isDirectory()){
			filePath+="/";
		}
		int index=filePath.indexOf(baseDirPath);
		return filePath.substring(index+baseDirPath.length());
	}
	
	
	public static void main(String[] args) {
		String baseDirName="E:";
		String fileName="工作图片/";
		String zipFileName="E:\\工作图片.zip";
		ZipTest.zipFile(baseDirName, fileName, zipFileName);
		//ZipTest.upzipFile("F:\\学习资料\\Python\\hibernate-release-4.2.4.Final.zip", "F:\\学习资料\\Python\\hibernate4.2.4");
	}
	
	
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值