zip压缩解压

中文乱码:用org.apache.tools.zip.*;

设置Encoding,测试的时候用的GBK结果是ok的,换成用UTF-8就乱码了,先放下,有空再来补

 

 

package com.ys.action.zip;
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;
import org.apache.commons.lang.SystemUtils;
import org.apache.tools.zip.*; 

/**
 * 压缩
 * @author hp
 *
 */
public class ZipToFile {
	
	public static final String ZIP_FILENAME	= "E:\\东西.zip";//需要解压缩的文件名
	public static final String ZIP_DIR = "E:\\东西\\";//需要压缩的文件夹
	public static final String UN_ZIP_DIR = "E:\\东西2";//要解压的文件目录
	public static final int BUFFER = 1024 ;//缓存大小
	
	public static void main(String[] args) throws Exception {

		zipFile(ZIP_DIR, ZIP_FILENAME);
		System.out.println("----------");
		unZipFile(ZIP_FILENAME,UN_ZIP_DIR);
	}
	
	/**
	* 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));
		zos.setEncoding("GBK");//设置的和文件名字格式一样或开发环境编码设置一样的话就能正常显示了
		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));
		
			System.out.println(ze.getName());
			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();
		System.out.println("ZIP ok");
	}
	
	/**
	* 给定根目录,返回另一个文件名的相对路径,用于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解压功能.
	* 解压unZipFileName文件到unZipPath路径
	* @throws Exception
	*/
	 public static void unZipFile(String unZipFileName, String unZipPath)
     throws Exception {
	   ZipFile zipFile = new ZipFile(
	   unZipFileName, "gbk");
	   unZipFileByOpache(zipFile, unZipPath);
	   System.out.println("unZip Ok");
	 }
	 
	 /**
	  * 解压流
	  * @param zipFile
	  * @param unZipRoot
	  * @throws Exception
	  * @throws IOException
	  */
	 @SuppressWarnings("unchecked")
	public static void unZipFileByOpache(ZipFile zipFile,
		      String unZipRoot) throws Exception, IOException {
		    Enumeration e = zipFile.getEntries();
		    System.out.println(zipFile.getEncoding());
		    ZipEntry zipEntry;
		    while (e.hasMoreElements()) {
		      zipEntry = (ZipEntry) e.nextElement();
		      InputStream fis = zipFile.getInputStream(zipEntry);
		      if (zipEntry.isDirectory()) {
		      } else {
		        File file = new File(unZipRoot + File.separator + zipEntry.getName());
		        System.out.println(file.getName());
		        File parentFile = file.getParentFile();
		        parentFile.mkdirs();
		        FileOutputStream fos = new FileOutputStream(file);
		        byte[] b = new byte[1024];
		        int len;
		        while ((len = fis.read(b, 0, b.length)) != -1) {
		          fos.write(b, 0, len);
		        }
		        fos.close();
		        fis.close();
		      }
		    }
		  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值