使用这个API可以解决中文乱码的问题 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class CopyOfZipUtils { private static final int BUFFER = 8192; private static void log(String msg) { System.out.println(msg); } private static String getFileName(String filePath) { int index = filePath.indexOf("."); return filePath.substring(0, index); } public static void zip(String sourceFilePath) { File fileDir = new File(sourceFilePath); if (fileDir.exists()) { log(fileDir.getPath() + " Starting Zip ..."); long startTime = System.currentTimeMillis(); doZip(fileDir); long endTime = System.currentTimeMillis(); long costTime = endTime - startTime; log("Zip Success!"); log("use time -- " + costTime + " millsec!"); } else { log("can't find the File!"); } } public static void unZip(String zipFilePath) { File fileDir = new File(zipFilePath); if (fileDir.exists()) { log(fileDir.getPath() + " Starting UnZip ..."); long startTime = System.currentTimeMillis(); doUnZip(fileDir); long endTime = System.currentTimeMillis(); long costTime = endTime - startTime; log("UnZip Success!"); log("use time -- " + costTime + " millsec!"); } else { log("can't find the File!"); } } public static void doZip(File file) { List fileList = new ArrayList(); List allFiles = (ArrayList) searchFiles(file.getPath(), fileList); Object[] fileArray = allFiles.toArray(); BufferedInputStream in = null; FileInputStream fis = null; ZipOutputStream zos = null; FileOutputStream fos = null; try { fos = new FileOutputStream(file.getParent() + File.separator + file.getName() + ".zip"); zos = new ZipOutputStream(new BufferedOutputStream(fos, BUFFER)); zos.setLevel(9); zos.setEncoding("GBK"); byte[] data = new byte[BUFFER]; for (int i = 0; i < fileArray.length; i++) { // 设置压缩文件入口entry,为被读取的文件创建压缩条目 具体要压缩的文件 File tempFile = new File(fileArray[i].toString());//c:/test/stat03_temp.xls String rootStr = file.getPath();//c:/test String entryStr = null; // entry以相对路径的形式设置。 // 如果设置不当,会出现拒绝访问等错误 // 分别处理单个文件/目录的entry if (rootStr.equals(tempFile.getPath())) { entryStr = tempFile.getName(); } else { entryStr = tempFile.getPath().substring( (rootStr + File.separator).length());//stat03_temp.xls } log(entryStr); ZipEntry entry = new ZipEntry(entryStr); zos.putNextEntry(entry); fis = new FileInputStream(tempFile); in = new BufferedInputStream(fis, BUFFER); int count; while ((count = in.read(data, 0, BUFFER)) != -1) { zos.write(data, 0, count); } } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (zos != null) { zos.close(); } } catch (Exception e) { e.printStackTrace(); } } } public static void doUnZip(File file) { try { final int BUFFER = 2048; BufferedOutputStream dest = null; // FileInputStream fis = new FileInputStream(file); // CheckedInputStream checksum = new CheckedInputStream(fis, // new Adler32()); // ZipInputStream zis = new ZipInputStream(new BufferedInputStream( // checksum)); ZipFile zipFile = new ZipFile(file); zipFile.getEntries(); java.util.Enumeration e = zipFile.getEntries(); ZipEntry entry; InputStream in = null; while (e.hasMoreElements()) { entry = (ZipEntry)e.nextElement(); log("Extracting: " + entry); int count; byte[] data = new byte[BUFFER]; log("unzip to " + getFileName(file.getPath())); FileOutputStream fos = new FileOutputStream(getFileName(file .getPath()) + File.separator + newDir(file, entry.getName())); in = new BufferedInputStream(zipFile.getInputStream(entry)); dest = new BufferedOutputStream(fos, BUFFER); while ((count = in.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } in.close(); // System.out // .println("Checksum: " + checksum.getChecksum().getValue()); } catch (Exception e) { e.printStackTrace(); } } //递归把文件及路径信息存放到list里面 public static List searchFiles(String sourceFilePath, List fileList) { File fileDir = new File(sourceFilePath); if (fileDir.isDirectory()) { File[] subfiles = fileDir.listFiles(); for (int i = 0; i < subfiles.length; i++) { searchFiles(subfiles[i].getPath(), fileList); } } else { fileList.add(fileDir); } return fileList; } //创建新文件夹 private static String newDir(File file, String entryName) { //c:/test.zip stat03_temp.xls String rootDir = getFileName(file.getPath());//c:/test log("root:" + rootDir); int index = entryName.lastIndexOf(file.separator); String dirStr = new File(rootDir).getParent();//c:/ log(dirStr); if (index != -1) { String path = entryName.substring(0, index); log("new Dir:" + rootDir + file.separator + path); new File(rootDir + file.separator + path).mkdirs(); log("entry:" + entryName.substring(0, index)); } else { new File(rootDir).mkdirs(); log("entry:" + entryName); } return entryName; } public static void main(String[] args) { // unZip("c://test.zip"); } }