`

zip压缩解决文件名中文乱码问题(2)

阅读更多

使用apache旗下的commons-compress 压缩和解压zip文件

可以参考我的前一篇博客:http://hw1287789687.iteye.com/blog/1976309

以下是我封装的一个工具类,专门负责zip的压缩和解压 

CompressZipUtil:

package com.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

import com.io.hw.file.util.FileUtils;
import com.string.widget.util.ValueWidget;
import com.swing.messagebox.GUIUtil23;

/***
 * use apache
 * commons-compress,http://www.cnblogs.com/un4sure/archive/2011/09/27/
 * 2193298.html,http://hw1287789687.iteye.com/blog/1976309
 * 
 * @author huangwei
 * @since 2013-11-18
 */
public final class CompressZipUtil {
	private CompressZipUtil() {
		throw new Error("Don't let anyone instantiate this class.");
	}

	/***
	 * 
	 * @param zipOut
	 * @param filepath
	 *            :要压缩的单个文件
	 * @throws IOException
	 */
	public static void addEntry(ZipArchiveOutputStream zipOut, String filepath)
			throws IOException {
		File singleFile = new File(filepath);
		if (singleFile.isDirectory()) {
			return;
		}
		ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(singleFile,
				SystemUtil.getFileSimpleName(filepath));
		zipOut.putArchiveEntry(zipEntry2);
		FileInputStream fin = new FileInputStream(filepath);
		// 不要关闭zipOut,关闭之前要执行closeArchiveEntry()
		FileUtils.writeIn2Output(fin, zipOut, false, true);
	}

	/***
	 * 
	 * @param zipOut
	 * @param filepath
	 *            : 要压缩的单个文件
	 * @throws IOException
	 */
	public static void addEntry(ZipArchiveOutputStream zipOut, File filepath)
			throws IOException {
		if (filepath.isDirectory()) {
			return;
		}
		ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(filepath,
				filepath.getName());
		zipOut.putArchiveEntry(zipEntry2);
		FileInputStream fin = new FileInputStream(filepath);
		// 不要关闭zipOut,关闭之前要执行closeArchiveEntry()
		FileUtils.writeIn2Output(fin, zipOut, false, true);
	}

	/***
	 * 
	 * @param zipOut
	 * @param filePaths
	 *            :要压缩的文件
	 * @throws IOException
	 */
	public static void compressZip(ZipArchiveOutputStream zipOut,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException {

		for (Object fileObj : filePaths) {
			if (fileObj instanceof File) {
				File file = (File) fileObj;
				addEntry(zipOut, file);
			} else {
				addEntry(zipOut, (String) fileObj);
			}
		}
		zipOut.closeArchiveEntry();
		zipOut.flush();
		zipOut.finish();
		zipOut.close();
	}

	/***
	 * 压缩.
	 * 
	 * @param zipFile
	 *            :压缩的结果--zip文件
	 * @param filePaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(File zipFile,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException,
			ArchiveException {
		FileOutputStream fou = new FileOutputStream(zipFile);
		ArchiveOutputStream archOuts = new ArchiveStreamFactory()
				.createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);
		if (archOuts instanceof ZipArchiveOutputStream) {
			ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;
			compressZip(zipOut, filePaths);
		}
	}

	/***
	 * 
	 * @param zipFile
	 *            :压缩的结果--zip文件
	 * @param filePaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException,
			ArchiveException {
		compressZip(new File(zipFile), filePaths);
	}

	/***
	 * compress single file.
	 * 
	 * @param zipFile
	 * @param filepath
	 *            :single file
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressSingeFile(String zipFile, String filepath)
			throws IOException, ArchiveException {
		List filePaths = new ArrayList();
		filePaths.add(filepath);
		compressZip(zipFile, filePaths);
	}

	/***
	 * compress single file.
	 * 
	 * @param zipFile
	 * @param filepath
	 *            :single file
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressSingeFile(String zipFile, File filepath)
			throws IOException, ArchiveException {
		List filePaths = new ArrayList();
		filePaths.add(filepath);
		compressZip(zipFile, filePaths);
	}

	/***
	 * 压缩指定文件夹中的所有文件.
	 * 
	 * @param zipFile
	 * @param folderPaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile, String folderPaths)
			throws IOException, ArchiveException {
		List list = FileUtils.getListFiles(new File(folderPaths));
		compressZip(zipFile, list);
	}

	/***
	 * 压缩指定文件夹中的所有文件.
	 * 
	 * @param zipFile
	 * @param folderPaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile, File folderPaths)
			throws IOException, ArchiveException {
		List list = FileUtils.getListFiles(folderPaths);
		compressZip(zipFile, list);
	}

	/***
	 * 解压zip
	 * 
	 * @param zipFile
	 * @param decompressLoc
	 *            :解压之后的文件所在目录
	 * @throws ArchiveException
	 * @throws IOException
	 */
	public static boolean decompress(String zipFile, File decompressLoc)
			throws ArchiveException, IOException {
		FileInputStream fin = new FileInputStream(zipFile);
		ArchiveInputStream archOuts = new ArchiveStreamFactory()
				.createArchiveInputStream(ArchiveStreamFactory.ZIP, fin);
		ZipArchiveInputStream zipIn = (ZipArchiveInputStream) archOuts;
		ZipArchiveEntry zipEntry;
		while (!ValueWidget.isNullOrEmpty(zipEntry = zipIn.getNextZipEntry())) {
			String fileName = zipEntry.getName();
			File singFile = new File(decompressLoc, fileName);
			if (singFile.exists()) {//若解压后的文件已经存在,则直接退出
				GUIUtil23.warningDialog("File \"" + singFile.getAbsolutePath()
						+ "\" does  exist.");
				zipIn.close();
//				break;
				return false;
			}
			System.out.println(fileName);
			FileUtils.writeIn2Output(zipIn, new FileOutputStream(singFile),
					true, false);
		}
		zipIn.close();
		return true;
	}

	/***
	 * 解压zip
	 * 
	 * @param zipFile
	 * @param decompressLoc
	 *            :解压之后的文件所在目录
	 * @throws ArchiveException
	 * @throws IOException
	 */
	public static boolean decompress(String zipFile, String decompressLocStr)
			throws ArchiveException, IOException {
		File decompressLoc = new File(decompressLocStr);
		return decompress(zipFile, decompressLoc);
	}

}

 附件:

(1)依赖的jar包 io0007-find_progess(包含源码)

(2)例子:目前只能压缩和解压一级目录的zip文件,zip_mgmt-0.0.1-SNAPSHOT.jar

执行方式 java -jar zip_mgmt-0.0.1-SNAPSHOT.jar:

 

  • 大小: 21.8 KB
0
0
分享到:
评论

相关推荐

    zip库(解决文件名中文乱码问题).zip

    总之,"zip库(解决文件名中文乱码问题).zip" 是一个专门为C++开发的、修复了中文文件名乱码问题的ZIP操作库。它提供了方便的API接口,使得开发者能够在处理中文文件名时更加得心应手,避免了编码转换带来的困扰。...

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    java压缩zip文件解决中文乱码问题

    例如,你可以使用Ant的`<zip>`任务来创建ZIP文件,通过指定`encoding`属性来解决中文乱码问题: ```xml <zip destfile="output.zip" encoding="UTF-8"> **/*"/> </zip> ``` 在这个Ant脚本中,`<zip>`...

    SharpCompress 解压缩zip,rar文件,解决中文乱码

    本文将深入探讨如何使用SharpCompress这一开源库来处理ZIP和RAR文件,并解决在处理中文文件名时可能出现的乱码问题。 SharpCompress是一款强大的、跨平台的压缩库,支持多种压缩格式,包括ZIP、TAR、GZIP、BZIP2、7...

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    文件解压和压缩 解决中文乱码

    这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...

    ICSharpCode.SharpZipLib压缩解决中文乱码dll和代码

    总结,ICSharpCode.SharpZipLib通过设置正确的编码参数,可以有效地解决在处理中文文件名时出现的乱码问题。在创建和解压缩ZIP文件时,应特别注意文件名和内容的编码设置,以确保数据的完整性和正确性。

    【文件下载】及解决文件名中文乱码问题

    总的来说,解决中文文件名乱码问题需要从多个角度考虑,包括服务器配置、HTTP头部设置、编码转换以及选择合适的工具。了解并掌握这些知识点,有助于我们在实际工作中更顺畅地处理各种语言环境下的文件下载问题。对于...

    Java中压缩与解压--中文文件名乱码解决办法

    ### Java中压缩与解压——中文文件名乱码解决办法 #### 一、问题背景及原理分析 在Java中处理文件的压缩与解压时...通过上述步骤,可以有效地解决Java中压缩与解压时中文文件名乱码的问题,使得程序更加健壮和实用。

    读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码(还是以支付宝对账单为例)

    本文将深入探讨如何在不解压的情况下直接读取ZIP文件,并特别关注如何处理包含中文文件名和内容乱码的问题。我们将以支付宝对账单为例,因为这类文件通常包含大量敏感和重要的财务信息,正确地读取和解析它们至关...

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

    * @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ ...

    解压文件时中文乱码问题处理

    本文将详细探讨如何在使用7-Zip软件解压文件时解决中文乱码问题,以及如何在C#编程环境中处理这一问题。 首先,我们需要了解乱码产生的原因。中文乱码通常是因为字符编码不一致导致的。当压缩文件创建时采用了一种...

    ZipUtil文件压缩工具类(解决中文乱码)

    总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...

    ZipOutputStream 压缩文件以及乱码问题解决方案

    本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码问题。 首先,我们来看`ZipOutputStream`的基本用法。这个类继承自`FilterOutputStream`,提供了创建ZIP文件的功能。以下是一个简单的...

    java压缩zip文件中文乱码问题解决方法

    总之,解决Java压缩ZIP文件中文乱码问题的关键在于使用支持设置编码的第三方库,并在处理中文内容和注释时明确指定正确的字符编码。这样,无论在何种编码环境中,都能确保中文字符正确无误地被压缩和解压。

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

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

    zip解压缩乱码的解决方案

    本文将深入探讨ZIP解压缩乱码的解决方案,帮助你解决这个问题。 1. **理解字符编码** - 字符编码是计算机存储和显示文本的方式,常见的有ASCII、GBK、UTF-8等。不同的编码方式对于特殊字符的表示不同,如果编码不...

    解决Java原生压缩组件不支持中文文件名乱码的问题

    在Java中,Zip压缩组件是原生的压缩工具,但是它不支持中文文件名的编码,这就会导致文件名乱码的问题。 解决这个问题的方法是使用Apache的ant压缩组件,which supports encoding for Chinese file names. Apache...

    分离自Ant的ZIP包可解决中文文件名处理问题

    这个名是名离自ant原码的,由于java.util.zip处理中文文件名时有问题可以用这个包代替那个使用就不会有中文问题了,我加了一个ZipTool.java,这个就是一个示例文件和方法打包文件。 <br>特点: 一、自有原码不...

Global site tag (gtag.js) - Google Analytics