解压zip文件有java自己提供的util包,但是针对中文问题,是无法解决的。
apache-ant就能解决这个问题。
package com.utils.basicUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* 压缩/解压缩zip包处理类
* <p>ClassName HZipUtil<p>
* <p>@date 2014-3-5 下午04:36:49<p>
* <p>@Description TODO <p>
*/
public class HZipUtil {
/**
* 判断是否是文件夹且是否存在,不存在,创建文件夹
* @Date :2014-3-5 上午09:07:22
* @param filepath
* @return :File
*/
public static File getFile(String filepath) throws Exception{
File file = new File(filepath);
if(!file.exists() && !file.isDirectory()){
file.mkdir();
}
return file;
}
/**
* 读取压缩文件中的所有文件名称
* @Date :2014-3-5 上午11:33:06
* @param uploadBizFileName
* @param tempPath
* @throws Exception
* @return :String
*/
public static String getZipHTML(String uploadBizFileName, String tempPath) throws Exception{
ZipFile zf = new ZipFile(tempPath);
for (Enumeration entries = zf.getEntries(); entries.hasMoreElements();) {
ZipEntry zipEntry = (ZipEntry) entries.nextElement();
if(!zipEntry.isDirectory()){
System.out.println(zipEntry.getName());
}
}
return "";
}
/**
* 解压文件到某个文件夹
* @Date :2014-3-5 上午10:23:35
* @param oldPath 压缩文件路径
* @param newPath 解压文件到某处
* @throws Exception
* @return :void
*/
@SuppressWarnings("unchecked")
public static void unZip(String oldPath,String newPath) throws Exception{
File helpFile = getFile(newPath);
ZipFile zipFile = new ZipFile(oldPath);
Enumeration en = zipFile.getEntries();
ZipEntry zipEntry = null;
while(en.hasMoreElements()){
zipEntry = (ZipEntry)en.nextElement();
if(zipEntry.isDirectory()){
String dirName = zipEntry.getName();
dirName = dirName.substring(0,dirName.length()-1);
File f = new File(helpFile.getPath()+File.separator+dirName);
f.mkdirs();
}else{
String strFilePath = helpFile.getPath()+File.separator+zipEntry.getName();
File f = new File(strFilePath);
if(!f.exists()){
String[] arrFolderName = zipEntry.getName().split("/");
String strRealFolder = "";
for(int i=0;i<(arrFolderName.length-1);i++){
strRealFolder += arrFolderName[i] +File.separator;
}
strRealFolder = helpFile.getPath()+File.separator+strRealFolder;
File tempDir = new File(strRealFolder);
tempDir.mkdirs();
}
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);
int c;
byte[] by = new byte[1024];
while((c=in.read(by))!=-1){
out.write(by,0,c);
}
out.flush();
out.close();
in.close();
}
}
zipFile.close();
}
/**
* 压缩文件
* @Date :2014-3-5 下午03:27:01
* @param zos 压缩输出流
* @param file 文件对象
* @param relativePath 相对路径
* @throws IOException
* @return :void
*/
public static void zipFile(ZipOutputStream zos,File file,String relativePath) throws IOException{
ZipEntry zipEntry = new ZipEntry(relativePath+file.getName());
zos.putNextEntry(zipEntry);
InputStream is = null;
try {
is = new FileInputStream(file);
int BUFFERSIZE =2<<10;
int length=0;
byte[] buffer = new byte[BUFFERSIZE];
while((length=is.read(buffer,0,BUFFERSIZE))>=0){
zos.write(buffer,0,length);
}
zos.flush();
zos.closeEntry();
} catch (IOException e) {
throw e;
} finally{
is.close();
}
}
/**
* 压缩
* @Date :2014-3-5 下午04:17:13
* @param zos 压缩输出流
* @param relativePath 相对路径
* @param absolutPath 文件或文件夹绝对路径
* @throws IOException
* @return :void
*/
public static void zip(ZipOutputStream zos ,String relativePath,String absolutPath) throws IOException{
File file = new File(absolutPath);
if(file.isDirectory()){
File[] files = file.listFiles();
for(int i=0;i<files.length;i++){
File tempFile = files[i];
String newAbsolutPath = relativePath +tempFile.getName()+File.separator;
createZipNode(zos, newAbsolutPath);
zip(zos, newAbsolutPath, newAbsolutPath);
}
}else{
zipFile(zos, file, relativePath);
}
}
/**
* 压缩
* @Date :2014-3-5 下午04:34:17
* @param zipFileName 压缩产生的zip包文件名---带路径,如果为null或空则默认按文件名生成压缩文件名
* @param relativePath 相对路径,默认为空
* @param directory 文件或目录的绝对路径
* @throws IOException
* @return :void
*/
public static void zip(String zipFileName,String relativePath,String directory) throws IOException{
String fileName = zipFileName;
if(fileName == null || fileName.trim().equals("")){
File temp = new File(directory);
if(temp.isDirectory()){
fileName = directory+".zip";
}else{
if(directory.indexOf(".")>0){
fileName = directory.substring(0,directory.lastIndexOf("."))+".zip";
}else{
fileName = directory+".zip";
}
}
}
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName));
try {
zip(zos, relativePath, directory);
} catch (IOException e) {
throw e;
}finally{
if(zos!=null){
zos.close();
}
}
}
/**
* 创建目录
* @Date :2014-3-5 下午04:02:46
* @param zos zip输出流
* @param relativePath 相对路径
* @throws IOException
* @return :void
*/
public static void createZipNode(ZipOutputStream zos,String relativePath) throws IOException{
ZipEntry zipEntry =new ZipEntry(relativePath);
zos.putNextEntry(zipEntry);
zos.closeEntry();
}
}