中文乱码:用org.apache.tools.zip.*;
设置Encoding,测试的时候用的GBK结果是ok的,换成用UTF-8就乱码了,先放下,有空再来补
package com.ys.action.zip;
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.ArrayList;
import java.util.Enumeration;
import java.util.List;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipFile;
//import java.util.zip.ZipOutputStream;
import org.apache.commons.lang.SystemUtils;
import org.apache.tools.zip.*;
/**
* 压缩
* @author hp
*
*/
public class ZipToFile {
public static final String ZIP_FILENAME = "E:\\东西.zip";//需要解压缩的文件名
public static final String ZIP_DIR = "E:\\东西\\";//需要压缩的文件夹
public static final String UN_ZIP_DIR = "E:\\东西2";//要解压的文件目录
public static final int BUFFER = 1024 ;//缓存大小
public static void main(String[] args) throws Exception {
zipFile(ZIP_DIR, ZIP_FILENAME);
System.out.println("----------");
unZipFile(ZIP_FILENAME,UN_ZIP_DIR);
}
/**
* zip压缩功能.
* 压缩baseDir(文件夹目录)下所有文件,包括子目录
* @throws Exception
*/
public static void zipFile(String baseDir,String fileName) throws Exception{
List fileList=getSubFiles(new File(baseDir));
ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));
zos.setEncoding("GBK");//设置的和文件名字格式一样或开发环境编码设置一样的话就能正常显示了
ZipEntry ze=null;
byte[] buf=new byte[BUFFER];
int readLen=0;
for(int i = 0; i <fileList.size(); i++) {
File f=(File)fileList.get(i);
ze=new ZipEntry(getAbsFileName(baseDir, f));
System.out.println(ze.getName());
ze.setSize(f.length());
ze.setTime(f.lastModified());
zos.putNextEntry(ze);
InputStream is=new BufferedInputStream(new FileInputStream(f));
while ((readLen=is.read(buf, 0, BUFFER))!=-1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
System.out.println("ZIP ok");
}
/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
* @param baseDir java.lang.String 根目录
* @param realFileName java.io.File 实际的文件名
* @return 相对文件名
*/
private static String getAbsFileName(String baseDir, File realFileName){
File real=realFileName;
File base=new File(baseDir);
String ret=real.getName();
while (true) {
real=real.getParentFile();
if(real==null)
break;
if(real.equals(base))
break;
else
ret=real.getName()+"/"+ret;
}
return ret;
}
/**
* 取得指定目录下的所有文件列表,包括子目录.
* @param baseDir File 指定的目录
* @return 包含java.io.File的List
*/
private static List getSubFiles(File baseDir){
List ret=new ArrayList();
File[] tmp=baseDir.listFiles();
for (int i = 0; i <tmp.length; i++) {
if(tmp[i].isFile())
ret.add(tmp[i]);
if(tmp[i].isDirectory())
ret.addAll(getSubFiles(tmp[i]));
}
return ret;
}
/**
* zip解压功能.
* 解压unZipFileName文件到unZipPath路径
* @throws Exception
*/
public static void unZipFile(String unZipFileName, String unZipPath)
throws Exception {
ZipFile zipFile = new ZipFile(
unZipFileName, "gbk");
unZipFileByOpache(zipFile, unZipPath);
System.out.println("unZip Ok");
}
/**
* 解压流
* @param zipFile
* @param unZipRoot
* @throws Exception
* @throws IOException
*/
@SuppressWarnings("unchecked")
public static void unZipFileByOpache(ZipFile zipFile,
String unZipRoot) throws Exception, IOException {
Enumeration e = zipFile.getEntries();
System.out.println(zipFile.getEncoding());
ZipEntry zipEntry;
while (e.hasMoreElements()) {
zipEntry = (ZipEntry) e.nextElement();
InputStream fis = zipFile.getInputStream(zipEntry);
if (zipEntry.isDirectory()) {
} else {
File file = new File(unZipRoot + File.separator + zipEntry.getName());
System.out.println(file.getName());
File parentFile = file.getParentFile();
parentFile.mkdirs();
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b, 0, b.length)) != -1) {
fos.write(b, 0, len);
}
fos.close();
fis.close();
}
}
}
}