zip、rar格式文件解壓縮處理
在相關業務場景中,批量文件處理,需要預先進行解壓縮及拷貝處理
核心pom依賴引入
<!-- 導入zip解壓包 -->
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
</dependency>
<!-- 導入rar解壓包 -->
<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.github.jnr</groupId>
<artifactId>jnr-posix</artifactId>
<version>3.0.50</version>
</dependency>
核心工具類FileUtil.java
public static boolean unPackagedFile(String filename,String dir){
InfDecompress rarDecompress = null;
if(filename.endsWith(".rar")){
rarDecompress = new RarDecompress(); //需要用rar4格式的壓縮包能被解析,高版本不行
}else if(filename.endsWith(".zip")){
rarDecompress = new ZipDecompress();
}else{
logger.error("不支持的解包擴展名格式");
return false;
}
if(!rarDecompress.decompressFile(filename,dir)){
logger.error(filename + "解壓失敗");
return false;
}
return true;
}
public static int copyFilesOfDir(String srcDirPath, String desDirPath) {
if (!srcDirPath.endsWith(File.separator)) {
srcDirPath = srcDirPath + File.separator;
}
if (!desDirPath.endsWith(File.separator)) {
desDirPath = desDirPath + File.separator;
}
File srcfile = new File(srcDirPath);
if (srcfile.exists()) {
String[] fileNames = srcfile.list();
//及時是個空目錄 也要創建一個空的目標目錄
if (fileNames != null) {
if (!new File(desDirPath).exists()) {
if (!new File(desDirPath).mkdirs()) {
logger.error("{failed to mkdirs " + desDirPath + "}");
return -1;
}
}
}
else {
return -1;
}
for (String fileName : fileNames) {
File fileToCopy = null;
if (srcDirPath.endsWith(File.separator)) {
fileToCopy = new File(srcDirPath + fileName);
} else {
fileToCopy = new File(srcDirPath + File.separator + fileName);
}
if (fileToCopy.isFile()) {
//copy file
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream(fileToCopy);
if (desDirPath.endsWith(File.separator)) {
outputStream = new FileOutputStream(desDirPath + fileToCopy.getName());
} else {
outputStream = new FileOutputStream(desDirPath + File.separator + fileToCopy.getName());
}
byte[] buffer = new byte[10240];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (FileNotFoundException ex) {
logger.error(ex.getMessage());
return -1;
} catch (IOException ex) {
logger.error(ex.getMessage());
return -1;
} finally {
}
} else {
continue;
}
}
}
return 0;
}
public static int copyFile(String srcFileNm,String DesFileNm)
{
InputStream input = null;
OutputStream output = null;
try{
File inFile = new File(srcFileNm);
File outFile = new File(DesFileNm);
/*if(!outFile.exists())
outFile.createNewFile();*/
input = new FileInputStream(inFile);
output = new FileOutputStream(outFile);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
}catch (Exception e){
logger.error("copyFileToDstdir 文件拷貝失敗,src:" + srcFileNm + " dst:" + DesFileNm + "errorMsg:" + e.getLocalizedMessage());
return -1;
}finally {
try{
if(input != null){
input.close();
}
if(output != null){
output.close();
}
}catch (IOException e){
logger.error(e.getMessage());
}
}
return 0;
}
public static int deleteDirRecursively(String absoluteDirPath)
{
File dir=new File(absoluteDirPath);
if(!dir.isDirectory())
{
if(!dir.delete())
{
logger.error("delete file failed "+ dir.getAbsolutePath());
return -1;
}
return 0;
}
else
{
String[] fileList=dir.list();
for(String fileName:fileList)
{
String absolutePath=absoluteDirPath+File.separator+fileName;
if(deleteDirRecursively(absolutePath)<0)
{
logger.error("delete file failed "+absolutePath);
return -1;
}
}
if(fileList.length==0)
{
if(!dir.delete())
{
logger.error(dir.getAbsolutePath()+" delele failed");
return -1;
}
}
}
return 0;
}
/**
* 從fileName全路徑中,獲取文件名稱
* @param fileName
* @return
*/
public static String getIndexOfFile(String fileName){
if(fileName == null){
return fileName;
}
if(fileName.lastIndexOf("\\") != -1){
return fileName.substring(fileName.lastIndexOf("\\")+1);
}
if(fileName.lastIndexOf("/") != -1){
return fileName.substring(fileName.lastIndexOf("/")+1);
}
return fileName;
}
統一接口
public interface InfDecompress {
boolean decompressFile(String fn,String dest);
}
rar格式解壓縮處理
import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
public class RarDecompress implements InfDecompress{
private static Logger logger = LoggerFactory.getLogger(RarDecompress.class);
@Override
public boolean decompressFile(String fn,String dest) {
Archive a = null;
try {
File inFile = new File(fn);
a = new Archive(new FileInputStream(inFile));
if(a!=null){
FileHeader fh = a.nextFileHeader();
while(fh != null){
if(fh.isDirectory()){
File fol = new File(dest + File.separator + fh.getFileNameString());
fol.mkdirs();
}else{
String unpackFile = dest + File.separator + fh.getFileNameString().trim();
File out = new File(unpackFile);
if(!out.exists()){
if (!out.getParentFile().exists()) {// 相對路徑可能多級,可能需要創建父目錄.
out.getParentFile().mkdirs();
}
out.createNewFile();
}
FileOutputStream os = new FileOutputStream(out);
a.extractFile(fh, os);
os.close();
if(unpackFile.endsWith(".rar") || unpackFile.endsWith(".zip")){ //子文件下還有被壓縮的文件
UnPackage.unPackagedFile(unpackFile,unpackFile.substring(0,unpackFile.lastIndexOf(File.separator)));
}
}
fh = a.nextFileHeader();
}
}else {
logger.error("Rar decompressFile異常");
return false;
}
a.close();
return true;
}catch (Exception e){
logger.error("解壓" + fn + "文件失敗" + e.getLocalizedMessage());
}
return false;
}
}
zip格式解壓縮處理
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
public class ZipDecompress implements InfDecompress{
private static Logger logger = LoggerFactory.getLogger(ZipDecompress.class);
@Override
public boolean decompressFile(String fn,String dest) {
try {
ZipFile zip = new ZipFile(fn,"gbk");
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
String unpackFile = dest + File.separator + zipEntryName.trim();
InputStream in = zip.getInputStream(entry);
OutputStream out = new FileOutputStream(dest + File.separator + zipEntryName);
if (new File(zipEntryName).isDirectory()) {
continue;
}
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
in.close();
out.close();
if(unpackFile.endsWith(".rar") || unpackFile.endsWith(".zip")){ //子文件下還有被壓縮的文件
UnPackage.unPackagedFile(unpackFile,unpackFile.substring(0,unpackFile.lastIndexOf(File.separator)));
}
}
zip.close();
}catch (Exception e){
logger.error("Zip decompressFile異常");
return false;
}
return true;
}
}
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流羣,羣號碼:543120397 我們一起學Java!