zapldy 发表于 2013-1-28 19:28:36

Java解压缩Zip文件(支持中文)

      最近有个项目需要用Java做解压缩Zip文件,由于JDK自带的zip相关的类都不支持以中文命名的文件,所以在网上搜索了些资料,自己花了点时间研究了下。希望和大家分享下,有不足的地方还多多指教。
 
      废话不多说,直接看代码吧!(记住:在classpath里面一定要引入ant.jar这个jar包。)
 
package org.zapldy.io;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 org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;public abstract class ZipUtils { public static void zip(String source, String dest) throws IOException {OutputStream os = new FileOutputStream(dest);BufferedOutputStream bos = new BufferedOutputStream(os);ZipOutputStream zos = new ZipOutputStream(bos);      //支持中文,但有缺陷!这是硬编码!zos.setEncoding("GBK");      File file = new File(source);String basePath = null;if (file.isDirectory()) {   basePath = file.getPath();} else {   basePath = file.getParent();}zipFile(file, basePath, zos);zos.closeEntry();zos.close(); } public static void unzip(String zipFile, String dest) throws IOException {ZipFile zip = new ZipFile(zipFile);Enumeration<ZipEntry> en = zip.getEntries();ZipEntry entry = null;byte[] buffer = new byte;int length = -1;InputStream input = null;BufferedOutputStream bos = null;File file = null;while (en.hasMoreElements()) {   entry = (ZipEntry) en.nextElement();   if (entry.isDirectory()) {    file = new File(dest, entry.getName());    if (!file.exists()) {   file.mkdir();    }    continue;   }   input = zip.getInputStream(entry);   file = new File(dest, entry.getName());   if (!file.getParentFile().exists()) {    file.getParentFile().mkdirs();   }   bos = new BufferedOutputStream(new FileOutputStream(file));   while (true) {    length = input.read(buffer);    if (length == -1)   break;    bos.write(buffer, 0, length);   }   bos.close();   input.close();}zip.close(); } private static void zipFile(File source, String basePath, ZipOutputStream zos) throws IOException {File[] files = new File;if (source.isDirectory()) {   files = source.listFiles();} else {   files = new File;   files = source;}String pathName;byte[] buf = new byte;int length = 0;for (File file : files) {   if (file.isDirectory()) {    pathName = file.getPath().substring(basePath.length() + 1) + "/";    zos.putNextEntry(new ZipEntry(pathName));    zipFile(file, basePath, zos);   } else {    pathName = file.getPath().substring(basePath.length() + 1);    InputStream is = new FileInputStream(file);    BufferedInputStream bis = new BufferedInputStream(is);    zos.putNextEntry(new ZipEntry(pathName));    while ((length = bis.read(buf)) > 0) {   zos.write(buf, 0, length);    }    is.close();   }} }} 
页: [1]
查看完整版本: Java解压缩Zip文件(支持中文)