在JAVA中解决Zip压缩乱码问题

简介: Java自带的zip压缩工具,可以让我们方便的压缩与解压缩,但是就是默认编码UTF-8没法改(至少我没找到,如果谁找到了,别忘记告诉我,我也不想用第三方的Jar包),虽然使用Java写打压缩与解压缩没问题,但是中文字符在WinRAR里面全是乱码。 所以我采用了Ant包中的压缩功能。 多余的话不多说了,代码才是硬道理,直接上代码吧。顺便说一下,该程序依赖于ant包,但是如果你只用到压缩,

Java自带的zip压缩工具,可以让我们方便的压缩与解压缩,但是就是默认编码UTF-8没法改(至少我没找到,如果谁找到了,别忘记告诉我,我也不想用第三方的Jar包),虽然使用Java写打压缩与解压缩没问题,但是中文字符在WinRAR里面全是乱码。

所以我采用了Ant包中的压缩功能。

多余的话不多说了,代码才是硬道理,直接上代码吧。顺便说一下,该程序依赖于ant包,但是如果你只用到压缩,你可以用WinRAR打开这个Ant.jar文件,删除org.apache.tools.zip包以外的所有class,就可以极度瘦身了。

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.Enumeration;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * 压缩解压缩<br>
 * 该程序依赖于Ant包 Ant 下载地址:http://ant.apache.org/
 * 
 * @author <a href="mailto:xzknet@gmail.com">Ken_xu</a>
 * @version 1.0 Copyright 2011年7月8日11:33:39
 */
public class KenZip {
	private Log log = LogFactory.getLog(this.getClass().getName());
	private static int BUF_SIZE = 1024;
	private static String ZIP_ENCODEING = "GBK";

	public KenZip() {
		this(1024 * 10);
	}

	public KenZip(int bufSize) {
		BUF_SIZE = bufSize;
	}

	/**
	 * 压缩文件或文件夹
	 * 
	 * @param zipFileName
	 * @param inputFile
	 * @throws Exception
	 */
	public void zip(String zipFileName, String inputFile) throws Exception {
		zip(zipFileName, new File(inputFile));
	}

	/**
	 * 压缩文件或文件夹
	 * 
	 * @param zipFileName
	 * @param inputFile
	 * @throws Exception
	 */
	public void zip(String zipFileName, File inputFile) throws Exception {
		// 未指定压缩文件名,默认为"ZipFile"
		if (zipFileName == null || zipFileName.equals(""))
			zipFileName = "ZipFile";

		// 添加".zip"后缀
		if (!zipFileName.endsWith(".zip"))
			zipFileName += ".zip";

		// 创建文件夹
		String path = Pattern.compile("[\\/]").matcher(zipFileName).replaceAll(File.separator);
		int endIndex = path.lastIndexOf(File.separator);
		path = path.substring(0, endIndex);
		File f = new File(path);
		f.mkdirs();
		// 开始压缩
		{
			ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
			zos.setEncoding(ZIP_ENCODEING);
			compress(zos, inputFile, "");
			log.debug("zip done");
			zos.close();
		}
	}

	/**
	 * 解压缩zip压缩文件到指定目录
	 * 
	 * @param unZipFileName
	 * @param outputDirectory
	 * @throws Exception
	 */
	public void unZip(String unZipFileName, String outputDirectory) throws Exception {
		// 创建输出文件夹对象
		File outDirFile = new File(outputDirectory);
		outDirFile.mkdirs();
		// 打开压缩文件文件夹
		ZipFile zipFile = new ZipFile(unZipFileName, ZIP_ENCODEING);
		for (Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();) {
			ZipEntry ze = (ZipEntry) entries.nextElement();
			File file = new File(outDirFile, ze.getName());
			if (ze.isDirectory()) {// 是目录,则创建之
				file.mkdirs();
				log.debug("mkdir " + file.getAbsolutePath());
			} else {
				File parent = file.getParentFile();
				if (parent != null && !parent.exists()) {
					parent.mkdirs();
				}
				log.debug("unziping " + ze.getName());
				file.createNewFile();
				FileOutputStream fos = new FileOutputStream(file);
				InputStream is = zipFile.getInputStream(ze);
				this.inStream2outStream(is, fos);
				fos.close();
				is.close();
			}
		}
		zipFile.close();
	}

	/**
	 * 压缩一个文件夹或文件对象到已经打开的zip输出流 <b>不建议直接调用该方法</b>
	 * 
	 * @param zos
	 * @param f
	 * @param fileName
	 * @throws Exception
	 */
	public void compress(ZipOutputStream zos, File f, String fileName) throws Exception {
		log.debug("Zipping " + f.getName());
		if (f.isDirectory()) {
			// 压缩文件夹
			File[] fl = f.listFiles();
			zos.putNextEntry(new ZipEntry(fileName + "/"));
			fileName = fileName.length() == 0 ? "" : fileName + "/";
			for (int i = 0; i < fl.length; i++) {
				compress(zos, fl[i], fileName + fl[i].getName());
			}
		} else {
			// 压缩文件
			zos.putNextEntry(new ZipEntry(fileName));
			FileInputStream fis = new FileInputStream(f);
			this.inStream2outStream(fis, zos);
			fis.close();
			zos.closeEntry();
		}
	}

	private void inStream2outStream(InputStream is, OutputStream os) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(is);
		BufferedOutputStream bos = new BufferedOutputStream(os);
		int bytesRead = 0;
		for (byte[] buffer = new byte[BUF_SIZE]; ((bytesRead = bis.read(buffer, 0, BUF_SIZE)) != -1);) {
			bos.write(buffer, 0, bytesRead); // 将流写入
		}
	}

	public static void main(String[] args) {
		try {
			KenZip t = new KenZip();
			t.zip("d:\\temp\\xzk2.zip", "E:\\驾校模拟考试");
			t.unZip("d:\\temp\\xzk2.zip", "E:\\驾校模拟考试2");
		} catch (Exception e) {
			e.printStackTrace(System.out);
		}
	}
}



相关文章
|
1天前
|
算法 Java
Java 压缩文件
在Java中压缩文件是一个常见的需求,通常可以通过使用Java自带的`java.util.zip`包来实现。这个包提供了`ZipOutputStream`类来创建ZIP格式的压缩文件。以下是一个简单的示例,展示了如何将多个文件压缩到一个ZIP文件中。 ### 示例:将多个文件压缩到一个ZIP文件中 ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFilesExample { public static vo
|
14天前
|
Java Maven
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
|
25天前
|
Java
Java SpringBoot 7z 压缩、解压
Java SpringBoot 7z 压缩、解压
42 1
|
22天前
|
存储 安全 算法
Java中防止压缩炸弹的技术分享
【8月更文挑战第17天】在软件开发和数据处理的日常工作中,我们经常会遇到各种压缩文件。然而,一种被称为“压缩炸弹”的恶意文件却给开发者带来了不小的困扰。压缩炸弹通过特殊设计的压缩算法,使得极小的文件在解压后能膨胀到异常巨大的体积,从而消耗大量系统资源甚至导致系统崩溃。本文将围绕“如何在Java中防止压缩炸弹”这一主题,分享一些实用的技术干货。
35 0
|
2月前
|
Java 运维
开发与运维技术问题之ava对象头压缩技术支持所有的Java垃圾回收器如何解决
开发与运维技术问题之ava对象头压缩技术支持所有的Java垃圾回收器如何解决
22 1
|
24天前
|
Java 大数据 测试技术
Java对象头压缩---- 永久为Java应用“降本增效”
本文介绍了一下OpenJDK的最新技术,对象头压缩,来大幅优化Java对象的内存占用。
|
2月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
37 1
|
2月前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
29 0
|
3月前
|
Java
赫夫曼压缩解压(java)
赫夫曼压缩解压(java)
|
3月前
|
Java
Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码
Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码