package com.keyware.kt.utiles;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.List;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.exception.RarException.RarExceptionType;
import com.github.junrar.rarfile.FileHeader;
public class ZipUtil {
private static final int buffer = 2048;
/**
* 解压Zip文件
* @param path 文件目录
*/
public static Boolean unZip(String path) throws Exception{
boolean flag = false;
int count = -1;
String savepath = "";
File file = null;
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
savepath = path.substring(0, path.lastIndexOf(".")) + File.separator; //保存解压文件目录
new File(savepath).mkdir(); //创建保存目录
ZipFile zipFile = null;
try
{
zipFile = new ZipFile(path,"gbk"); //解决中文乱码问题
Enumeration<?> entries = zipFile.getEntries();
while(entries.hasMoreElements())
{
byte buf[] = new byte[buffer];
ZipEntry entry = (ZipEntry)entries.nextElement();
String filename = entry.getName();
boolean ismkdir = false;
if(filename.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹
ismkdir = true;
}
filename = savepath + filename;
if(entry.isDirectory()){ //如果是文件夹先创建
file = new File(filename);
file.mkdirs();
continue;
}
file = new File(filename);
if(!file.exists()){ //如果是目录先创建
if(ismkdir){
new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); //目录先创建
}
}
file.createNewFile(); //创建文件
is = zipFile.getInputStream(entry);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, buffer);
while((count = is.read(buf)) > -1)
{
bos.write(buf, 0, count);
}
bos.flush();
bos.close();
fos.close();
is.close();
}
zipFile.close();
flag = true;
}catch(IOException ioe){
ioe.printStackTrace();
throw ioe;
}finally{
try{
if(bos != null){
bos.close();
}
if(fos != null) {
fos.close();
}
if(is != null){
is.close();
}
if(zipFile != null){
zipFile.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
return flag;
}
/**
* @param rarFileName rar file name
* @param outFilePath output file path
* @return success Or Failed
* @author zhuss
* @throws Exception
*/
public static boolean unrar(String rarFileName) throws Exception{
boolean flag = false;
try {
Archive archive = new Archive(new File(rarFileName));
if(archive == null){
throw new FileNotFoundException(rarFileName + " NOT FOUND!");
}
if(archive.isEncrypted()){
throw new Exception(rarFileName + " IS ENCRYPTED!");
}
List<FileHeader> files = archive.getFileHeaders();
String savepath = rarFileName.substring(0, rarFileName.lastIndexOf(".")) + File.separator;
for (FileHeader fh : files) {
if(fh.isEncrypted()){
throw new Exception(rarFileName + " IS ENCRYPTED!");
}
String fileName1 = fh.getFileNameString();
String fileName = URLDecoder.decode(fileName1, "UTF-8");
if(fileName != null && fileName.trim().length() > 0){
String saveFileName = savepath+"\\"+fileName;
File saveFile = new File(saveFileName);
if(saveFile.isDirectory()){
continue;
}
File parent = saveFile.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}
if(!saveFile.exists()){
saveFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(saveFile);
try {
archive.extractFile(fh, fos);
fos.flush();
fos.close();
//archive.close();
} catch (RarException e) {
if(e.getType().equals(RarExceptionType.notImplementedYet)){
}
}finally{
fos.flush();
fos.close();
//archive.close();
}
}
}
archive.close();
flag = true;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return flag;
}
/**
* 解压缩
*/
public static Boolean deCompress(String sourceFile) throws Exception{
//根据类型,进行相应的解压缩
String type = sourceFile.substring(sourceFile.lastIndexOf(".")+1);
if(type.equals("zip")){
return unZip(sourceFile);
}else if(type.equals("rar")){
return unrar(sourceFile);
}else{
throw new Exception("只支持zip和rar格式的压缩包!");
}
}
}
一个解压缩和压缩zip文件的工具类
最新推荐文章于 2022-08-30 19:52:06 发布