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

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);
		}
	}
}
时间: 2024-10-27 05:30:40

在JAVA中解决Zip压缩乱码问题的相关文章

在Java中操作Zip文件,压缩/解压

压缩 可随意转载,但请注明出处及作者SonyMusic2003.05.28==========================================================================在Java中操作Zip文件,压缩/解压 package test.nothing; import java.io.*;import java.util.*;import java.util.zip.*; import com.beaconsystem.util.*; impor

Java中解决中文乱码问题的方法

Java中解决中文乱码问题的方法 public  String   chStr(String string){   if(string==null){      string="";   }else{      try{         string=(new String(string.getBytes("iso-8859-1"),"GB3212")).trim();      }catch(Exception e){         e.pr

JAVA中的deflate压缩实现方法_java

在文件的传输过程中,为了使大文件能够更加方便快速的传输,一般采用压缩的办法来对文件压缩后再传输,JAVA中的java.util.zip包中的Deflater和Inflater类为使用者提供了DEFLATE算法的压缩功能,以下是自已编写的压缩和解压缩实现,并以压缩文件内容为例说明,其中涉及的具体方法可查看JDK的API了解说明. /** * * @param inputByte * 待解压缩的字节数组 * @return 解压缩后的字节数组 * @throws IOException */ pub

java中解决组件重叠的问题(例如鼠标移动组件时)

java中解决组件覆盖的问题!      有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖!在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序). 真正麻烦的是响应哪个组件,这就要创建一个链表,把组件对象按顺序存起来,响应事件时扫描这个链表,按 链表中的先后顺序选择响应组件对象.      所以要想满足自己的需求,那么在添加组件的时候就要注意顺序就好了!      另外如果不想用上面的方法,那么你就采用JLayeredPane这个类,分层面

使用java基础类实现zip压缩和zip解压工具类分享_java

使用java基础类写的一个简单的zip压缩解压工具类 复制代码 代码如下: package sun.net.helper; import java.io.*;import java.util.logging.Logger;import java.util.zip.*; public class ZipUtil {    private final static Logger logger = Logger.getLogger(ZipUtil.class.getName());    privat

java文件操作zip压缩文件读取写操作

本文章讲了三个实例是利用java对zip 压缩文件的读写操作,实例如下. 创建一个zip压缩文件 import java.io.fileinputstream; import java.io.fileoutputstream; import java.util.zip.zipentry; import java.util.zip.zipoutputstream; public class main {   public static void main(string[] args) throws

php 中解决json中文乱码的函数

php教程自带了json_encode来处理json数据,那么它们对中文的支持不好,下面我们来看个实例 echo json_encode(array(123213,'中国')); {"platformid":"123213","userid":"1023","username":"u00b7u00f0u00b5u00b2u00c9u00b1u00b7u00f0u00ccu00fc"} 我

JAVA 中的zip 打包问题???

问题描述 我采用的是zip的无压缩级别的打包,打包出来的文件要比原文件大,有没有算法可以在打包前就算出zip的大小??求各位大神帮忙,谢谢 解决方案 解决方案二:算不出来的吧...单文件也就估计下复杂的多种类型文件什么的应该更没办法了...解决方案三:压缩的大小取决于被打包文件的信息格式.所以这个只能估算.

通过 C# 使用 J# 类库中的 Zip 类压缩文件和数据

数据|压缩 本文假设您熟悉 C# 和 Windows 窗体 下载本文的代码: ZipCompression.exe (150KB) 摘要 在存储文件或者通过网络发送文件时,使用 Zip 压缩可以节省空间和网络带宽.此外,还不会丢失经过 Zip 的文件夹的目录结构,这使其成为非常有用的压缩方案.C# 语言不具有任何使您可以操纵 Zip 文件的类,但是由于面向 .NET 的语言可以共享类实现,并且 J# 在 java.util.zip 命名空间中公开了类,因此您可以在 C# 代码中使用这些类.本文将