解压 汉语压缩包 和压缩包内有中文文件的代码

解压 中文压缩包 和压缩包内有中文文件的代码

最近在搞解压缩的问题,发现了用java.util.zip  是可以解压压缩包,但是解压含有中文的压缩包就会报错。所以改用ant.jar来解决这个问题,代码如下:

 

 

 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipFile;

public class ZipFileList
{
	public static final int DEFAULT_BUFFER = 1024 * 4;
	public static long copy(InputStream aIn, OutputStream aOut, int aBufferSize)
			throws IOException
	{
		byte[] buffer = new byte[aBufferSize];
		int read = 0;
		long totalBytes = 0;
		while (-1 != (read = aIn.read(buffer)))
		{
			aOut.write(buffer, 0, read);
			totalBytes += read;
		}
		return totalBytes;
	}

	public static long copy(InputStream aIn, OutputStream aOut)
			throws IOException
	{
		return copy(aIn, aOut, DEFAULT_BUFFER);
	}

	public static void unzip1(File zipFileName, File outputDirectory)
			throws Exception
	{
		ZipFile zf = null;
		try
		{
			zf = new ZipFile(zipFileName,"GBK");
			Enumeration en = zf.getEntries();
			while (en.hasMoreElements())
			{
				org.apache.tools.zip.ZipEntry entry = (org.apache.tools.zip.ZipEntry) en
						.nextElement();
				System.out.println(entry.getName());

				FileOutputStream out = null;
				try
				{
					System.out.println(entry.isDirectory());

					if (!entry.isDirectory())
					{
						File newFile = new File(outputDirectory,
								entry.getName());
						newFile.getParentFile().mkdirs();
						out = new FileOutputStream(newFile);
						copy(zf.getInputStream(entry), out);
					}

				}
				catch (Exception io)
				{
					io.printStackTrace();
					throw io;
				}
				finally
				{
					if (out != null) out.close();
				}

			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if (zf != null) zf.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args)
	{

		try
		{
			ZipFileList.unzip1(new File("F:/中文.zip"), new File("f:/a"));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("OK");
	}

}
 

 

上面的代码已经经过测试没有问题。如有问题请留言。望多交流。