如何基于java實(shí)現(xiàn)解壓ZIP TAR等文件
java實(shí)現(xiàn)對(duì)常用.ZIP , .TAR, .TAR.BZ2, .BZ2 ,.TAR.GZ ,.GZ格式文件的解壓。
首先需要引入maven依賴,這里使用的是Apache的壓縮工具包c(diǎn)ommon-compress,改工具包支持解壓、壓縮,此代碼中我列舉出一個(gè)zip的壓縮示例,其他格式的只需切換改格式對(duì)應(yīng)的流即可。
對(duì)于RAR格式文件的解壓,目前該工具包還不支持,希望大家做過(guò)的可以多多交流。
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.19</version></dependency>
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;
/**
* @author :zhangzhiyong
* @description: java實(shí)現(xiàn)常見(jiàn)文件格式的解壓與壓縮
* 支持.ZIP .TAR .TAR.BZ2 .BZ2 .TAR.GZ .GZ
* 其他格式compress包也支持,在此基礎(chǔ)上開(kāi)發(fā)即可
* 另外壓縮文件只寫(xiě)了ZIP壓縮的方法zipCompression,其他的格式類似,換成對(duì)應(yīng)的文件流即可。
* 暫不支持RAR壓縮格式,RAR可以用junrar的工具包,但是有缺陷:
* 其一:如果壓縮文件中有中文名字的文件夾,解壓以后文件夾名字是亂碼,但是不影響文件夾里面的文件;
* 其二:最新 WinRar 壓縮產(chǎn)生的 .rar 文件可能會(huì)無(wú)法解壓。
* 缺陷原因:rar 有版權(quán),有些東西沒(méi)有公開(kāi),對(duì)解壓有一些限制,即使其他解壓包也可能有問(wèn)題,但是建議嘗試。
* @date :2020/7/1 20:44
*/
public class CompressionFileUtil {
/**
* @param filePath 需要解壓的zip文件的完成路徑。
* @param unzipPath 解壓過(guò)后生成文件的存放路徑
* @description: 對(duì)zip文件進(jìn)行解壓。
* @return: boolean
* @author: ZZY
* @time: 2020/7/2 14:47
*/
public static boolean zipUnCompress(String filePath, String unzipPath) throws IOException {
System.out.println("開(kāi)始解壓ZIP..........");
FileInputStream fis = null;
ZipArchiveInputStream zis = null;
try {
File file = new File(filePath);
fis = new FileInputStream(file);
zis = new ZipArchiveInputStream(fis);
ZipArchiveEntry nze = null;
while ((nze = zis.getNextZipEntry()) != null) {
FileOutputStream os = null;
BufferedOutputStream bos = null;
try {
System.out.println("正在解壓....." + nze.getName());
//自動(dòng)添加File.separator文件路徑的分隔符,根據(jù)系統(tǒng)判斷是\\還是/
String dir = unzipPath + File.separator + nze.getName(); //解壓全路徑
System.out.println("dir---" + dir);
File file1 = null;
if (nze.isDirectory()) {
file1 = new File(dir);
file1.mkdirs();
} else {
file1 = new File(dir);
os = new FileOutputStream(file1);
bos = new BufferedOutputStream(os);
/*byte [] bt = new byte[1024];
int len = 0;
while((len = zis.read(bt,0,1024)) != -1){
bos.write(bt,0,len);
}*/
IOUtils.copy(zis, bos); //作用與上面注釋代碼一樣
}
System.out.println("解壓完成......");
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} finally {
if (bos != null) {
bos.close();
}
if (os != null) {
os.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (zis != null) {
zis.close();
}
if (fis != null) {
fis.close();
}
}
return true;
}
/**
* @param filesPathArray 多個(gè)文件的絕對(duì)路徑,是一個(gè)數(shù)組。
* @param zipFilePath 生成的壓縮文件的位置,包括生成的文件名,如D:\zip\test.zip
* @description: 將多個(gè)文件壓縮成ZIP壓縮包。
* @return: boolean
* @author: ZZY
* @time: 2020/7/2 14:42
*/
public static boolean zipCompression(String[] filesPathArray, String zipFilePath) throws Exception {
System.out.println("開(kāi)始?jí)嚎sZIP文件");
ZipArchiveOutputStream zos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(zipFilePath));
zos = new ZipArchiveOutputStream(fos);
for (String filePath : filesPathArray) {
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
File file = new File(filePath);
// 第二個(gè)參數(shù)如果是文件全路徑名,那么壓縮時(shí)也會(huì)將路徑文件夾也縮進(jìn)去;
// 我們只壓縮目標(biāo)文件,而不壓縮該文件所處位置的相關(guān)文件夾,所以這里我們用file.getName()
System.out.println("開(kāi)始?jí)嚎s..." + file.getName());
ZipArchiveEntry zae = new ZipArchiveEntry(file, file.getName());
zos.putArchiveEntry(zae);
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int count;
byte[] bt = new byte[1024];
while ((count = bis.read(bt, 0, 1024)) != -1) {
zos.write(bt, 0, count);
}
} finally {
zos.closeArchiveEntry();
if (bis != null)
bis.close();
if (fis != null)
fis.close();
}
}
} finally {
if (zos != null)
zos.close();
if (fos != null)
fos.close();
}
System.out.println("壓縮完成......");
return true;
}
/**
* @param inputStream 每種TAR文件用不同的輸入流,unCompress方法中已注明
* @param unTarPath TAR文件解壓后的存放路徑
* @description: 解壓TAR類文件,包括.TAR .TAR.BZ2 .TAR.GZ
* @return: void
* @author: ZZY
* @time: 2020/7/2 17:42
*/
public static void unTar(InputStream inputStream, String unTarPath) throws IOException {
FileInputStream fis = null;
TarArchiveInputStream tis = null;
try {
tis = new TarArchiveInputStream(inputStream);
TarArchiveEntry nte = null;
System.out.println("開(kāi)始解壓......");
while ((nte = tis.getNextTarEntry()) != null) {
String dir = unTarPath + File.separator + nte.getName();
System.out.println("正在解壓......" + dir);
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
if (nte.isDirectory()) {
File file1 = new File(dir);
file1.mkdirs();
} else {
File file2 = new File(dir);
fos = new FileOutputStream(file2);
bos = new BufferedOutputStream(fos);
IOUtils.copy(tis, bos);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
bos.close();
}
if (fos != null) {
fos.close();
}
}
}
System.out.println("解壓完成......");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (tis != null) {
tis.close();
}
if (fis != null) {
fis.close();
}
}
}
public static boolean unCompress(String filePath,String unCompressPath) throws Exception {
String fileType = filePath.toUpperCase();
if(fileType.endsWith(".TAR")){
System.out.println("解壓的.TAR包");
//.TAR包用一般的FileInputStream流讀取
unTar(new FileInputStream(filePath),unCompressPath);
}
else if(fileType.endsWith(".TAR.GZ")){
System.out.println("解壓的.TAR.GZ包");
//.TAR.GZ包要用GzipCompressorInputStream讀取
unTar(new GzipCompressorInputStream(new FileInputStream(filePath)),unCompressPath);
}
else if(fileType.endsWith(".TAR.BZ2")){
System.out.println("解壓的.TAR.BZ2包");
unTar(new BZip2CompressorInputStream(new FileInputStream(filePath)),unCompressPath);
}
else if(fileType.endsWith(".ZIP")){
System.out.println("解壓的.ZIP包");
zipUnCompress(filePath,unCompressPath);
}
else{
System.out.println("暫不支持該種格式文件的解壓");
}
return true;
}
public static void main(String[] args) throws Exception {
unCompress("D:\\test\\zip\\nginx-1.18.0.rar","D:\\test\\zip");
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能
- Java實(shí)現(xiàn)解壓zip和rar包的示例代碼
- Java壓縮和解壓縮ZIP文件實(shí)戰(zhàn)案例
- Java實(shí)現(xiàn)文件壓縮為zip和解壓zip壓縮包
- Java如何不解壓讀取.zip的文件內(nèi)容
- Java中zip的壓縮和解壓縮的實(shí)現(xiàn)代碼
- 用Java進(jìn)行zip文件壓縮與解壓縮
- Java GZip 基于磁盤(pán)實(shí)現(xiàn)壓縮和解壓的方法
- Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法
- 使用java API實(shí)現(xiàn)zip遞歸壓縮和解壓文件夾
- Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí))
相關(guān)文章
String split方法實(shí)現(xiàn)過(guò)程圖解
這篇文章主要介紹了String split方法實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
使用JavaWeb webSocket實(shí)現(xiàn)簡(jiǎn)易的點(diǎn)對(duì)點(diǎn)聊天功能實(shí)例代碼
這篇文章主要介紹了使用JavaWeb webSocket實(shí)現(xiàn)簡(jiǎn)易的點(diǎn)對(duì)點(diǎn)聊天功能實(shí)例代碼的相關(guān)資料,內(nèi)容介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
postman中POST請(qǐng)求時(shí)參數(shù)包含參數(shù)list設(shè)置方式
這篇文章主要介紹了postman中POST請(qǐng)求時(shí)參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
java.lang.UnsupportedClassVersionError異常正確解決方法
java.lang.UnsupportedClassVersionError異常通常發(fā)生在嘗試在較低版本的Java虛擬機(jī)上運(yùn)行使用更高版本的Jav 編譯器編譯的類文件時(shí),下面就來(lái)介紹一下解決方法,感興趣的可以了解一下2024-05-05
java文件操作工具類實(shí)現(xiàn)復(fù)制文件和文件合并
這篇文章主要介紹了java文件操作工具類,類實(shí)現(xiàn)了復(fù)制文件和文件合并的功能,需要的朋友可以參考下2014-03-03
java使用JNA(Java Native Access)調(diào)用dll的方法
java使用JNA(Java Native Access)調(diào)用windows系統(tǒng)的dll文件的例子2013-11-11
java報(bào)錯(cuò):找不到或無(wú)法加載主類的解決方法簡(jiǎn)單粗暴
本文主要介紹了java報(bào)錯(cuò):找不到或無(wú)法加載主類的解決方法簡(jiǎn)單粗暴,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
SpringBoot深入探究@Conditional條件裝配的使用
這篇文章主要為大家介紹了SpringBoot底層注解@Conditional的使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

