[url]http://www.oschina.net/code/snippet_2482052_54816[/url]
package com.yabushan.test.util.upload;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.LoggerFactory;
public class ZipUtil {
protected static final org.slf4j.Logger log = LoggerFactory.getLogger(ZipUtil.class);
private static final int BUFFER = 2048;
/**
* 解压文件到指定路径
*
* @param filePath
* @param upZipPath
* @return 返回解压的文件集合
*/
public static List<File> unZip(String filePath, String upZipPath) {
List<File> list = new ArrayList<File>();
int count = -1;
File file = null;
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
// 生成指定的保存目录
String savePath = upZipPath;
if (!new File(savePath).exists()) {
new File(savePath).mkdirs();
}
try {
ZipFile zipFile = new ZipFile(filePath, "GBK");
Enumeration enu = zipFile.getEntries();
while (enu.hasMoreElements()) {
ZipEntry zipEntry = (ZipEntry) enu.nextElement();
if (zipEntry.isDirectory()) {
new File(savePath + "/" + zipEntry.getName()).mkdirs();
continue;
}
if (zipEntry.getName().indexOf("/") != -1) {
new File(savePath
+ "/"
+ zipEntry.getName().substring(0,
zipEntry.getName().lastIndexOf("/")))
.mkdirs();
}
is = zipFile.getInputStream(zipEntry);
file = new File(savePath + "/" + zipEntry.getName());
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, BUFFER);
byte buf[] = new byte[BUFFER];
while ((count = is.read(buf)) > -1) {
bos.write(buf, 0, count);
}
bos.flush();
fos.close();
is.close();
list.add(file);
}
zipFile.close();
return list;
} catch (IOException ioe) {
log.error(ioe.getMessage());
return list;
}
}
/**
* RAR 需要配置rar路径
*
* @param filePath
* @param unRarPath
* 路径要唯一,否则获取文件列表会出错
* @return
*/
public static int unRar(String filePath, String unRarPath) {
int result = -99;
if (!(new File(unRarPath).exists())) {
new File(unRarPath).mkdirs();
}
try {
//String cmd = GlobalConfig.getConfigValue("cmd.path");
String cmd="test";
String unrarCmd = cmd + " e -r -o+ " + filePath + " " + unRarPath;
Runtime rt = Runtime.getRuntime();
Process pre = rt.exec(unrarCmd);
while(result==-99){
try {
Thread.sleep(1000L);
result = pre.exitValue();
} catch (Exception e) {
// TODO: handle exception
result = -99;
}
}
InputStreamReader isr = new InputStreamReader(pre.getInputStream());
BufferedReader bf = new BufferedReader(isr);
String line = null;
while ((line = bf.readLine()) != null) {
line = line.trim();
if ("".equals(line)) {
continue;
}
log.info(line);
}
bf.close();
if (result != 0) {
log.error("unRar " + pre.exitValue());
}
// 杀死进程 退出
// pre.destroy();
return result;
} catch (Exception e) {
log.error(e.getMessage() + ": " + e.getStackTrace());
return -2;
}
}
/***
* 将多个文件打成压缩包
*
* @param list
* 需打包的文件路径集合
* @param zipfilename
* 压缩包名称
*/
public static void listToZip(List<String> list, String zipfilename) {
FileInputStream is = null;
String path = "";
File file = null;
ZipOutputStream zos = null;
try {
if (list != null && list.size() > 0) {
//String uri = GlobalConfig.getConfigValue("zipFile.path");
String uri="D:/ZIP";
File f = new File(uri);
if(!f.exists()){
f.mkdirs();
}
zipfilename = uri + zipfilename;
//创建zip文件输出流
zos = new ZipOutputStream(new FileOutputStream(new File(
zipfilename)));
zos.setEncoding("GBK");
for (int i = 0; i < list.size(); i++) {
path = list.get(i);
file = new File(path);
if (file.exists()) {
//创建源文件输入流
is = new FileInputStream(file);
zos.putNextEntry(new ZipEntry(file.getName()));
byte[] buf = new byte[BUFFER];
int length = -1;
while ((length = is.read(buf)) != -1) {
zos.write(buf, 0, length);
zos.flush();
}
zos.closeEntry();
is.close();
} else {
System.out.println("源文件不存在");
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (zos != null) {
zos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/***
* 将多个文件打成压缩包(压缩包内文件名称由参数中传入)
*
* @param list
* 需打包的文件信息集合
* @param zipfilename
* 压缩包名称
*/
public static void listMapToZip(List<Map<String,Object>> list, String zipfilename) {
FileInputStream is = null;
String path = "";
File file = null;
ZipOutputStream zos = null;
try {
if (list != null && list.size() > 0) {
//String uri = GlobalConfig.getConfigValue("zipFile.path");
String uri="D:/ZIP";
File f = new File(uri);
if(!f.exists()){
f.mkdirs();
}
zipfilename = uri + zipfilename;
//创建zip文件输出流
zos = new ZipOutputStream(new FileOutputStream(new File(
zipfilename)));
zos.setEncoding("GBK");
for (Map map : list) {
path = map.get("filePath")+"";
file = new File(path);
if (file.exists()) {
//创建源文件输入流
is = new FileInputStream(file);
zos.putNextEntry(new ZipEntry(map.get("fileName")+""));
byte[] buf = new byte[BUFFER];
int length = -1;
while ((length = is.read(buf)) != -1) {
zos.write(buf, 0, length);
zos.flush();
}
zos.closeEntry();
is.close();
} else {
System.out.println("源文件不存在");
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (zos != null) {
zos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<String>();
list.add("D:/File/img/tempImg/7f7ffd45856be6aa.txt");
list.add("D:/File/img/tempImg/63f8959465093ec0.jpeg");
list.add("D:/File/img/tempImg/815b476dc8cf790e.txt");
list.add("D:/File/img/tempImg/4451519220dad91a.txt");
//ZipUtil.listToZip(list, "测试.zip");
System.out.println(ZipUtil.unZip("D:/ZIP测试.zip", "D:/ZIP/bb/").toString());
}
}