/**
* 解压缩zip包
*
* @param zipFilePath zip文件路径
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
* @throws IOException
* @author yayagepei
* @date 2008-9-28
*/
public String unZip(String zipFilePath, String targetPath) throws IOException {
OutputStream os = null;
InputStream is = null;
ZipFile zipFile = null;
String resultPath = null;
try {
zipFile = new ZipFile(zipFilePath,"GBK");
String directoryPath = "";
if (null == targetPath || "".equals(targetPath)) {
directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));
} else {
directoryPath = targetPath;
}
Enumeration<ZipEntry> entryEnum = zipFile.getEntries();
if (null != entryEnum) {
ZipEntry zipEntry = null;
while (entryEnum.hasMoreElements()) {
zipEntry = (ZipEntry) entryEnum.nextElement();
if (zipEntry.isDirectory()) {
continue;
}
if (zipEntry.getSize() > 0) {
// 文件
File targetFile = buildFile(directoryPath + File.separator
+ zipEntry.getName(), false);
if (zipEntry.getName().contains("webapps")
&& "index.html".equals(targetFile.getName())) {
resultPath = targetFile.getAbsolutePath();
}
os = new BufferedOutputStream(new FileOutputStream(targetFile));
is = zipFile.getInputStream(zipEntry);
byte[] buffer = new byte[4096];
int readLen = 0;
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
os.write(buffer, 0, readLen);
}
os.flush();
os.close();
} else {
}
}
}
} catch (IOException ex) {
throw ex;
} finally {
if (null != zipFile) {
zipFile = null;
}
if (null != is) {
is.close();
}
if (null != os) {
os.close();
}
}
return resultPath;
}
/**
* 解压rar格式压缩包。 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar
*/
public String unrar(String sourceRar, String destDir) throws Exception {
String resultPath = null;
Archive a = null;
FileOutputStream fos = null;
try {
a = new Archive(new File(sourceRar));
if (null == destDir || "".equals(destDir)) {
destDir = a.getFile().getParentFile().getAbsolutePath();
}
FileHeader fh = a.nextFileHeader();
while (fh != null) {
if (!fh.isDirectory()) {
// 1 根据不同的操作系统拿到相应的 destDirName 和 destFileName
String compressFileName = "";
if (fh.isUnicode()) {
compressFileName = fh.getFileNameW().trim();
} else {
compressFileName = fh.getFileNameString().trim();
}
String destFileName = "";
String destDirName = "";
// 非windows系统
if (File.separator.equals("/")) {
destFileName = destDir +File.separator+ compressFileName.replaceAll("\\\\", "/");
destDirName = destFileName.substring(0, destFileName.lastIndexOf("/"));
// windows系统
} else {
destFileName = destDir + compressFileName.replaceAll("/", "\\\\");
destDirName = destFileName.substring(0, destFileName.lastIndexOf("\\"));
}
// 2创建文件夹
File dir = new File(destDirName);
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdirs();
}
File destFile=new File(destFileName);
// 3解压缩文件
fos = new FileOutputStream(destFile);
if ("index.html".equals(destFile.getName())) {
resultPath = destFileName;
}
a.extractFile(fh, fos);
fos.close();
fos = null;
}
fh = a.nextFileHeader();
}
a.close();
a = null;
} catch (Exception e) {
throw e;
} finally {
if (fos != null) {
try {
fos.close();
fos = null;
} catch (Exception e) {
e.printStackTrace();
}
}
if (a != null) {
try {
a.close();
a = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return resultPath;
}
/**
* 生产文件 如果文件所在路径不存在则生成路径
*
* @param fileName 文件名 带路径
* @param isDirectory 是否为路径
* @return
* @author yayagepei
* @date 2008-8-27
*/
public File buildFile(String fileName, boolean isDirectory) {
File target = new File(fileName);
if (isDirectory) {
target.mkdirs();
} else {
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
if (target.exists()) {
target.delete();
}
target = new File(target.getAbsolutePath());
}
}
return target;
}