Java中zip的壓縮和解壓縮的實現(xiàn)代碼
在Java中可以使用ZipOutputStream和ZipInputStream來實現(xiàn)zip的壓縮和解壓縮操作,另外使用FileSystem也可以用來實現(xiàn)zip的解壓縮,下面將介紹這幾種方式,直接上代碼。
zip壓縮
待壓縮文件目錄結(jié)構(gòu):

每個zip文件項都要對應(yīng)一個ZipEntry,然后通過ZipOutputStream的putNextEntry方法開始寫入一個新的zip文件項,將文件數(shù)據(jù)發(fā)送到zip輸出流中,完成后再調(diào)用closeEntry方法。
@Test
public void testCompressByZip() {
try (
//指定壓縮完成后zip文件的存儲路徑
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("F:\\myFavorites.zip"))
)
{
//待壓縮文件/目錄所在的目錄
File fileFolder = new File("F:\\我的收藏");
//獲取目錄下的所有文件
File[] files = fileFolder.listFiles();
ZipEntry zipEntry;
byte[] byteArray;
int len;
//遍歷目錄下的所有文件/目錄,并將它們添加到壓縮文件中
for (File file : files) {
//一個ZipEntry對應(yīng)壓縮文件中的一項
zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
try (FileInputStream in = new FileInputStream(file)) {
byteArray = new byte[1024];
while ((len = in.read(byteArray)) != -1) {
zipOutputStream.write(byteArray, 0, len);
}
} catch (IOException ex) {
ex.printStackTrace();
}
zipOutputStream.closeEntry();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
壓縮結(jié)果:

zip解壓縮
遍歷zip文件中的所有項,并獲取對應(yīng)項的輸入流,然后通過FileOutputStream輸出到指定目錄中。
@Test
public void testDecompressByZip() {
try (
//指定需要解壓縮的zip文件
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("F:\\myFavorites.zip"))
)
{
ZipEntry zipEntry;
byte[] byteArray;
int len;
//遍歷zip文件中的所有項,并逐個解壓到指定的目錄中
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\我的解壓目錄\\" + zipEntry.getName())) {
byteArray = new byte[1024];
while ((len = zipInputStream.read(byteArray)) != -1) {
fileOutputStream.write(byteArray, 0, len);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
解壓縮結(jié)果:

使用FileSystem解壓縮
- 建立一個文件系統(tǒng),包含zip文件中的所有項。
- 遍歷zip文件中的所有項,通過文件訪問器SimpleFileVisitor將每個項復(fù)制到指定目錄中。
@Test
public void testDecompressByZip2(){
try {
//將壓縮文件作為一個文件系統(tǒng)訪問
FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\\myFavorites.zip"), null);
//遍歷壓縮文件中的內(nèi)容,并使用文件訪問器訪問所有內(nèi)容
Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("訪問目錄中文件時調(diào)用");
//將文件解壓到指定目錄
Files.copy(file, new FileOutputStream("F:\\我的解壓目錄\\" + file.getName(file.getNameCount() - 1)));
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("訪問目錄中文件之前調(diào)用");
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("訪問目錄中文件失敗時調(diào)用");
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("訪問目錄中的文件及其所有后代之后調(diào)用");
return FileVisitResult.CONTINUE;
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
到此這篇關(guān)于Java中zip的壓縮和解壓縮的實現(xiàn)代碼的文章就介紹到這了,更多相關(guān)java zip壓縮和解壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java工具類實現(xiàn)文件壓縮zip以及解壓縮功能
- Java實現(xiàn)解壓zip和rar包的示例代碼
- Java壓縮和解壓縮ZIP文件實戰(zhàn)案例
- Java實現(xiàn)文件壓縮為zip和解壓zip壓縮包
- Java如何不解壓讀取.zip的文件內(nèi)容
- 用Java進(jìn)行zip文件壓縮與解壓縮
- Java GZip 基于磁盤實現(xiàn)壓縮和解壓的方法
- Java GZip 基于內(nèi)存實現(xiàn)壓縮和解壓的方法
- 使用java API實現(xiàn)zip遞歸壓縮和解壓文件夾
- 如何基于java實現(xiàn)解壓ZIP TAR等文件
- Java實現(xiàn)解壓zip壓縮包的兩種方法(支持多層級)
相關(guān)文章
升級springboot3之自動配置導(dǎo)入失效問題及解決
這篇文章主要介紹了升級springboot3之自動配置導(dǎo)入失效問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot創(chuàng)建定時任務(wù)的示例詳解
在Spring Boot中創(chuàng)建定時任務(wù),通常使用@Scheduled注解,這是Spring框架提供的一個功能,允許你按照固定的頻率(如每天、每小時、每分鐘等)執(zhí)行某個方法,本文給大家介紹了SpringBoot創(chuàng)建定時任務(wù)的示例,需要的朋友可以參考下2024-04-04
Java基礎(chǔ)之Comparable與Comparator概述
這篇文章主要介紹了Java基礎(chǔ)之Comparable與Comparator詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
淺析SpringBoot統(tǒng)一返回結(jié)果的實現(xiàn)
前后端開發(fā)過程中數(shù)據(jù)交互規(guī)范化是一件非常重要的事情,不僅可以減少前后端交互過程中出現(xiàn)的問題,也讓代碼邏輯更加具有條理,下面小編就和大家講講SpringBoot如何統(tǒng)一返回結(jié)果的吧2023-07-07
SpringBoot?Profile多環(huán)境配置方式
這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Java下利用Jackson進(jìn)行JSON解析和序列化示例
本篇文章主要介紹了Java下利用Jackson進(jìn)行JSON解析和序列化示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號碼脫敏)
這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機(jī)號碼脫敏),的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

