package com.zhihua.file;
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 org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* Java操作zip压缩和解压缩文件工具类
* 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
public class ZipUtils {
private static byte[] _byte = new byte[1024];
/**
* 对.zip文件进行解压
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param zipFile 解压缩文件
* @param targetPath 压缩的目标地址
* @return
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@SuppressWarnings("rawtypes")
public static List<File> decompressionZipFile(File zipFile,String targetPath){
List<File> list = new ArrayList<File>();
try{
ZipFile _zipFile = new ZipFile(zipFile,"GBK");
for(Enumeration entries = _zipFile.getEntries();entries.hasMoreElements();){
ZipEntry entry = (ZipEntry) entries.nextElement();
File _file = new File(targetPath+File.separator+entry.getName());
if(entry.isDirectory()){
_file.mkdirs();
}else{
File _parent = _file.getParentFile();
if(!_parent.exists()){
_parent.mkdirs();
}
InputStream _in = _zipFile.getInputStream(entry);
OutputStream _out = new FileOutputStream(_file);
int len = 0;
while((len=_in.read(_byte))>0){
_out.write(_byte, 0, len);
}
_in.close();
_out.flush();
_out.close();
list.add(_file);
}
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
/**
* 压缩zip文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param targetPath 压缩的目的地址 如:E:/xxx.zip
* @param sourceFiles 压缩的源文件
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
public static void compressZipFile(String targetPath,List<File> sourceFiles){
try{
if(targetPath.endsWith(".zip")|| targetPath.endsWith(".ZIP")){
ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(new File(targetPath)));
zipOutStream.setEncoding("GBK");
for (File file : sourceFiles) {
addSourceFile(targetPath, zipOutStream, file, "");
}
zipOutStream.close();
}else{
System.out.println("target file["+targetPath+"] is not .zip type file");
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 压缩文件 注:如果压缩文件是一个文件夹,那压缩包存放的位置不能在该文件夹下
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param targetPath 压缩的目的地址
* @param zipOutStream
* @param sourceFile 被压缩的文件
* @param path 在zip中的相对路径
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
* @throws IOException
*/
private static void addSourceFile(String targetPath,ZipOutputStream zipOutStream,File sourceFile,String path) throws IOException{
System.out.println("begin to compression file["+sourceFile.getName()+"]");
if(!"".equals(path) && !path.endsWith(File.separator)){
path += File.separator;
}
if(!sourceFile.getPath().equals(targetPath)){
if(sourceFile.isDirectory()){
File[] files = sourceFile.listFiles();
if(files.length==0){
zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()+File.separator));
zipOutStream.closeEntry();
}else{
for(File f:files){
addSourceFile(targetPath, zipOutStream, f, path+sourceFile.getName());
}
}
}else{
InputStream in = new FileInputStream(sourceFile);
zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()));
int len = 0;
while((len=in.read(_byte))>0){
zipOutStream.write(_byte,0,len);
}
in.close();
zipOutStream.closeEntry();
}
}
}
}
测试类:
package com.zhihua.file.test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.zhihua.file.ZipUtils;
public class ZipUtilsTest {
/**
* 解压文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void decompressionZipFile(){
String zipPath = "E:/mkdir/copy/test.zip";
File zipFile = new File(zipPath);
String targetPath = "E:/mkdir/zip/";
ZipUtils.decompressionZipFile(zipFile, targetPath);
}
/**
* 压缩文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void compressZipFile(){
File f1 = new File("E:/mkdir/copy/free.ftl");
File f2 = new File("E:/mkdir/del/login.wav");
List<File> list = new ArrayList<File>();
list.add(f1);
list.add(f2);
String targetPath = "E:/mkdir/del/compress.zip";
ZipUtils.compressZipFile(targetPath, list);
}
}