import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
/**
*
* @ClassName: FileCompress
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 周玉波
* @date 2017年4月11日 上午9:30:11
*
*/
@SuppressWarnings("rawtypes")
public final class FileCompress{
/**
* zip解压缩
*
* @param zipfile
* File 需要解压缩的文件
* @param descDir
* String 解压后的目标目录
*/
public static String unZipFiles(java.io.File zipfile, String descDir) {
InputStream in =null;
OutputStream out =null;
ZipFile zf=null;
File file=null;
String zipEntryName="";
try {
descDir=descDir.replaceAll("\\/", "\\\\").replaceAll("\\.zip", "");
//jdk1.8没有参数Charset,适用于1.7
zf = new ZipFile(zipfile,Charset.forName("GBK"));
for (Enumeration entries = zf.entries(); entries
.hasMoreElements();) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
zipEntryName = entry.getName();
boolean ismkdir = false;
if(zipEntryName.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹
ismkdir = true;
}
zipEntryName = descDir+"\\" + zipEntryName;
if(entry.isDirectory()){ //如果是文件夹先创建
file = new File(zipEntryName);
file.mkdirs();
continue;
}
file = new File(zipEntryName);
if(!file.exists()){ //如果是目录先创建
if(ismkdir){
new File(zipEntryName.substring(0, zipEntryName.lastIndexOf("/"))).mkdirs(); //目录先创建
}
}
//file.createNewFile(); //创建文件
in = zf.getInputStream(entry);
File dstDiretory = new File(descDir);
if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
dstDiretory.mkdirs();
}
out = new FileOutputStream(zipEntryName);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
System.out.println("解压缩完成.");
}
return zipEntryName.replaceAll("/", "\\\\");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(out!=null){
out.close();
out=null;
}
if(in!=null){
in.close();
in=null;
}
if(zf!=null){
zf.close();
zf=null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.gc();
}
return null;
}
/**
* 根据原始rar路径,解压到指定文件夹下.
* @param srcRarPath 原始rar路径
* @param dstDirectoryPath 解压到的文件夹
*/
public static String unRarFile(String srcRarPath, String dstDirectoryPath) {
dstDirectoryPath=dstDirectoryPath.replaceAll("\\/", "\\\\").replaceAll("\\.rar", "");
//dstDirectoryPath=dstDirectoryPath.substring(0,dstDirectoryPath.lastIndexOf("\\"));
if (!srcRarPath.toLowerCase().endsWith(".rar")) {
System.out.println("非rar文件!");
return "";
}
File dstDiretory = new File(dstDirectoryPath);
if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
dstDiretory.mkdirs();
}
Archive a = null;
FileOutputStream os=null;
try {
a = new Archive(new File(srcRarPath));
if (a != null) {
a.getMainHeader().print(); // 打印文件信息.
FileHeader fh = a.nextFileHeader();
while (fh != null) {
if (fh.isDirectory()) { // 文件夹
File fol = new File(dstDirectoryPath + File.separator
+ fh.getFileNameString());
fol.mkdirs();
} else { // 文件
File out = new File(dstDirectoryPath + File.separator
+ fh.getFileNameString().trim());
//System.out.println(out.getAbsolutePath());
try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压.
if (!out.exists()) {
if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.
out.getParentFile().mkdirs();
}
out.createNewFile();
}
os = new FileOutputStream(out);
a.extractFile(fh, os);
} catch (Exception ex) {
ex.printStackTrace();
}finally{
if(os!=null){
os.close();
os=null;
}
}
}
fh = a.nextFileHeader();
}
}
return dstDirectoryPath;
} catch (Exception e) {
e.printStackTrace();
}finally{
if(a!=null){
try {
a.close();
a=null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return "";
}
}
RAR的解压需要导入包junrar-0.7.jar
java 解压zip、rar文件
最新推荐文章于 2024-10-16 10:13:45 发布