`

org.apache.tools.zip实现文件的压缩和解压,支持中文

    博客分类:
  • J2EE
 
阅读更多
刚开始用java.util.Zip,发现不支持中文(网上有修改的方法,但比较麻烦)
后改用org.apache.tools.zip
org.apache.tools.zip的使用网上有更简单的例子
下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

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

import common.Logger;//in jxl.jar (excel)

public class ZipUtil {

	/**
	 * zip操作帮助类
	 * bylijinnan
	 */
	final static Logger logger = Logger.getLogger(ZipUtil.class);

	/**
	 * 打包指定目录下所有文件,包括子文件夹
	 * @param sourceFolder	要打包的文件目录
	 * @param outputFolder	生成的压缩文件存放的目录
	 * @param zipFileName	生成的压缩文件名
	 * @throws IOException
	 */
	public static void zipFolder(String sourceFolder, String outputFolder,String zipFileName, String encoding) throws IOException {
		if (isEmptyStr(sourceFolder) || isEmptyStr(outputFolder) || isEmptyStr(zipFileName)) {
			logger.error("invalid parameters.");
			return;
		}
		sourceFolder = formatFilePath(sourceFolder);
		outputFolder = formatFilePath(outputFolder);
		List<String> filelist = generateFileList(sourceFolder);
		zipFileList(filelist, sourceFolder, outputFolder, zipFileName, encoding);
	}
	
	
	/**
	 * 打包指定的文件。要打包的文件在文件列表中指定
	 * @param filelist	要打包的文件列表,这些文件是绝对路径
	 * @param outputFullFileName	生成的压缩文件全名,目录+文件名
	 * @throws IOException
	 */
	public static void zipFileList(List<String> filelist, String sourceFolder, String outputFolder, String zipFileName, String encoding) throws IOException {
		if (filelist == null || filelist.isEmpty()) {
			logger.error("no files to be zip. filelist is null or empty.");
			return;
		}
		if (isEmptyStr(outputFolder) || isEmptyStr(zipFileName)) {
			logger.error("outputFolder and zipFileName are unspecified.");
			return;
		}
		
		sourceFolder = formatFilePath(sourceFolder);
		outputFolder = formatFilePath(outputFolder);
		if (isEmptyStr(encoding)) {
			encoding = "UTF-8";
		}
		
		File outputDir = new File(outputFolder);
		if (!outputDir.exists()) {
			outputDir.mkdirs();
		}
		
		byte[] buffer = new byte[1024];

		String outputFullFileName = (outputFolder + "/" + zipFileName);
		FileOutputStream fos = new FileOutputStream(outputFullFileName);
		ZipOutputStream zos = new ZipOutputStream(fos);
		zos.setEncoding(encoding);
		logger.info("Output to Zip : " + outputFullFileName);

		for (String file : filelist) {
			if (isEmptyStr(file)) {
				continue;
			}
			logger.info("File Added : " + file);
			ZipEntry ze = new ZipEntry(file);	//这里用的是相对路径
			zos.putNextEntry(ze);

			FileInputStream in = new FileInputStream(sourceFolder + "/" + file);		//这里是绝对路径

			int len;
			while ((len = in.read(buffer)) > 0) {
				zos.write(buffer, 0, len);
			}

			in.close();
		}

		zos.closeEntry();
		// remember close it
		zos.close();

		logger.info("Compress Done");

	}

	/**
	 * Traverse a directory and get all files(include the files in sub directory), add the file into fileList and return it.
	 * 
	 * @param sourceFolder
	 *            file or directory
	 * @return filelist
	 */
	public static List<String> generateFileList(String sourceFolder) {
		List<String> filelist = null;
		if (!isEmptyStr(sourceFolder)) {
			sourceFolder = formatFilePath(sourceFolder);
			filelist = new ArrayList<String>();
			File node = new File(sourceFolder);
			generateFileListHelper(sourceFolder, node, filelist);
		}
		return filelist;
	}
	
	private static void generateFileListHelper(String sourceFolder, File node, List<String> filelist) {

		// add file only
		if (node.isFile()) {
			String absoluteFile = node.getAbsoluteFile().toString();
			String filepath = generateZipEntry(sourceFolder, absoluteFile);
			filelist.add(filepath);
		}

		if (node.isDirectory()) {
			String[] subNote = node.list();
			for (String filename : subNote) {
				File subFile = new File(node, filename);
				generateFileListHelper(sourceFolder, subFile, filelist);
			}
		}

	}

	/**
	 * Format the file path for zip.
	 * Delete the "SOURCE_FOLDER" directory info,e.g.
	 * d:\ziptest\tmpty.txt 		--> tmpty.txt 
	 * d:\ziptest\sub\t.xls 	-->	sub\t.xls
	 * 
	 * @param file
	 *            file path
	 * @return Formatted file path.
	 */
	private static String generateZipEntry(String sourceFolder, String file) {
		logger.debug("sourceFolder=" + sourceFolder);
		logger.debug("file=" + file);
		String formattedPath = file.substring(sourceFolder.length() + 1);
		formattedPath = formatFilePath(formattedPath);
		logger.debug("formattedPath=" + formattedPath);
		return formattedPath;
	}
	
	/**
	 * 将文件路径中的分隔符转换成"/",并去掉最后的分隔符(如果有)
	 * @param str	文件路径 
	 * @return 格式化后的文件路径
	 */
	public static String formatFilePath(String str) {
		if (str != null && str.length() !=0) {
			 str = str .replaceAll("\\\\", "/");
		}
		if (str.endsWith("/")) {
			str = str.substring(0, str.length()-1);
		}
		return str;
	}
	
	private static boolean isEmptyStr(String str) {
		return str == null || str.length() == 0;
	}
	
	/**
	 * 解压zip文件,支持子文件夹和中文
	 * @param zipFileFullName .zip文件的完整名字,包括文件夹路径
	 * @param outputFolder	解压到指定的文件夹。完整路径,如果不指定或者为null,则默认解压到压缩文件所在的当前文件夹
	 * @param encoding 编码格式
	 */
	@SuppressWarnings("rawtypes")
	public static void unzip(String zipFileFullName, String outputFolder, String encoding) {
		if (zipFileFullName == null || zipFileFullName.length() == 0) {
			return;
		}
		if (!zipFileFullName.endsWith(".zip")) {
			logger.error(zipFileFullName + " is not a zip file.");
			return;
		}
		//change file separator to "/"
		zipFileFullName = zipFileFullName.replaceAll("\\\\", "/");
		//find outputFolder
		String inputFolder = zipFileFullName.replaceAll("/[^/]+\\.zip", "");
		if (outputFolder == null || outputFolder.length() == 0) {
			outputFolder = inputFolder;
		}
		outputFolder = outputFolder.replaceAll("\\\\", "/");
		
		File outputFolderFile = new File(outputFolder);
		if (!outputFolderFile.exists()) {
			outputFolderFile.mkdirs();
		}
		try {
			ZipFile zip = new ZipFile(zipFileFullName, encoding);
			Enumeration zipFileEntries = zip.getEntries();

			while (zipFileEntries.hasMoreElements()) {
				ZipEntry entry =  (ZipEntry) zipFileEntries.nextElement();
				String entryName = entry.getName();
				logger.debug("Extracting,entryName=" + entryName);
				
				/*用本程序中ZipUtil.zipFolder或者ZipUtil.zipFileList生成的zip文件,如果有子文件夹,entry.getName()会直接得到文件而略过了子文件夹:
				 * 程序生成,解压时输出:
				 * Extracting,entryName=sub/subsub/test.txt
				 * 压缩软件7-Zip生成,解压时输出:
				 * Extracting,entryName=sub/subsub/ 
				 * Extracting,entryName=sub/subsub/test.txt
				 * 因此要区别对待
				 */
				
				int lastSlashPos = entryName.lastIndexOf("/");
				if (lastSlashPos != -1 ){
					String folderStr = outputFolder + "/" + entryName.substring(0, lastSlashPos);
					File folder = new File(folderStr);
					if (!folder.exists()) {
						folder.mkdirs();
					}
				}
				if (!entryName.endsWith("/")) {		//this entry is not a directory.
					File outFile = new File(outputFolder + "/" + entryName);
					FileOutputStream fos = new FileOutputStream(outFile);
					Writer bw = new BufferedWriter(new OutputStreamWriter(fos, encoding));
					
					InputStream in = zip.getInputStream(entry);
					Reader reader = new InputStreamReader(in, encoding); 
					BufferedReader br =  new BufferedReader(reader);
					
					String line;
					while ((line = br.readLine()) != null) {
						bw.write(line);
					}
					bw.close();
				}
			}

		} catch (Exception e) {
			logger.error("errors occur when decompressing.");
			e.printStackTrace();
		}
	}
	
	public static void main(String[] argv) {
		
		String sourceFolder = "d:/ziptest";
		String outputFolder = "d:/ziptest";
		String outputFileName = "ziptest.zip";
		try {
			zipFolder(sourceFolder, outputFolder, outputFileName, "GB2312");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		String zipFileFullName = "d:\\ziptest\\ziptest.zip";
		unzip(zipFileFullName, "d:\\ziptest\\unzip", "GB2312");
		
	}

	
}



0
0
分享到:
评论

相关推荐

    org.apache.tools.zip.*文件打包需要的jar包

    import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream;...需要的jar包,压缩zip包和解压zip包,远程打包,文件批量下载、文件批量上传

    org.apache.tools.zip解决解压乱码问题

    import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/解压缩zip包处理类 * 创建...

    java压缩使用org.apache.tools.zip包解决中文文件名

    http://mirror.bjtu.edu.cn/apache//ant/source/apache-ant-1.8.2-src.zip 使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩...

    java压缩中文处理使用org.apache.tools.zip已经打包成jar

    java压缩中文处理使用org.apache.tools.zip已经打包成jar 只要放在LIB文件夹下,然后在JSP 或 JAVA 里引用即可。 &lt;%@ page language="java" import="java.sql.*,java.io.*,org.apache.tools.zip.Zip" pageEncoding=...

    org.apache.tools.zip

    java 程序编写文件压缩成zip 和解压zip文件

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    Java ZIP压缩一个或多个文件(解决中文名称乱码).rar

    用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。

    tools and ant jar

    tools and ant jar, 用于压缩文件,解压文件的java工具类,使用方法有对应的博客。

    android解压zip乱码处理(包括ant瘦身后的jar)

    在android开发中,有时候需要将文件打包成zip或将zip解压,如果直接用java.util.zip包下面的类会出现中文乱码,如果直接用org.apache.tools.zip(ant包中的压缩功能)会影响项目的编译时间; 故将ant包中文件瘦身,既...

    Java压缩、解压代码集合。(支持中文)----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    2种压缩、解压的实现 1&gt; j2se的zip压缩解压实现 2&gt; 基于apache tools的压缩解压实现

    APACHE 2.2.9+TOMCAT6.0.18配置负载均衡

    TOMCAT6.0.20下载:apache-tomcat-6.0.20.zip直接解压。http://tomcat.apache.org/download-60.cgi Jdk安装目录下D:\toots\Java\jdk1.6.0_18\bin\msvcr71.dll复制到C:\WINDOWS\system32下 二、 安装过程 设置环境...

    Android SDK开发包国内官网下载地址.pdf

    platform-tools_r14-linux.zip 10.4M 将platform-tools目录解压到sdk所在目录 官网 platform-tools_r14-macosx.zip 10.8M 官网 platform-tools_r14-windows.zip 10.6M 官网 假如你已经安装过android sdk,想单独...

    详解java解压缩zip和rar的工具类使用教程

    详解java解压缩zip和rar的工具类使用教程直接上代码 package decompress;  import java.io.File;  import java.io.FileOutputStream;  import org.apache.tools.ant.Project;  import org.apache.tools.ant...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset ...• 多媒体支持 包括常见的音频、视频和...

    JSP课程设计案例精编-源码

    从http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 下载Tomcat软件,这里我们使用Tomcat 5.0.28,下载并默认安装。 在安装步骤Apeche Tomcat Setup:Java Virtual Machine path selection中选择步骤1中JDK...

    关于HTTP传输中gzip压缩的秘密探索分析

    而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器...

Global site tag (gtag.js) - Google Analytics