Java Zip文件讀寫(xiě)操作詳解
輸入流(讀取):
ZipInputStream是一種FileInputStream流,它可以直接讀取Zip壓縮包的內(nèi)容:
┌───────────────────┐
│ InputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│InflaterInputStream│
└───────────────────┘
▲
│
┌───────────────────┐
│ ZipInputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ JarInputStream │
└───────────────────┘
另一個(gè)JarInputstream是從ZipInputStream派生出來(lái)的,它增加的主要功能是直接讀取jar文件里面的MANIFEST.MF文件。因?yàn)楸举|(zhì)上jar包就是zip包,只是額外增加了一些固定的描述文件。
根據(jù)上述繼承關(guān)系,最終還是回到了Inputstream這個(gè)抽象類(lèi)中。而Java的IO標(biāo)準(zhǔn)庫(kù)使用Decorator裝飾器模式為Inputstream和OutputStream增加功能:
可以把一個(gè)Inputstream和任意一個(gè)FilterInputStream組合。
可以把一個(gè)OutputStream和任意一個(gè)FilterOutputStream組合。
通過(guò)裝飾器模式也就可以使用ZipInputStream來(lái)操作ZIP文件了。
ZipInputstream的基本用法是:
創(chuàng)建一個(gè)ZipInputstream對(duì)象,傳入一個(gè)FileInputstream作為數(shù)據(jù)源,然后調(diào)用getNextEntry()方法,直到返回值為null,表示zip流結(jié)束。
一個(gè)ZipEntry表示一個(gè)壓縮文件或目錄,如果是壓縮文件,我們就用read()方法不斷讀取,直到返回-1:
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Demo02 {
public static void main(String[] args) {
try (ZipInputStream zip = new ZipInputStream(new FileInputStream("d:\\IOTest\\1-201023201325.zip"),
Charset.forName("gbk"))) {
ZipEntry entry = null;
// 獲取壓縮文件中的每個(gè)子文件
while ((entry = zip.getNextEntry()) != null) {
System.out.println(entry.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}輸出流(寫(xiě)入):
也稱為壓縮流,它用于以zip格式寫(xiě)入文件,也就是把文件打包成壓縮文件,常用于附件下載,文件壓縮存儲(chǔ)。
┌───────────────────┐
│ OutputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
▲
│
┌────────────────────┐
│DeflaterOutputStream│
└────────────────────┘
▲
│
┌───────────────────┐
│ ZipInputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ JarOutputStream │
└───────────────────┘
壓縮流常用的兩個(gè)方法為:
1.
// 開(kāi)始寫(xiě)入新的 ZIP 文件條目并將流定位到條目數(shù)據(jù)的開(kāi)頭。如果仍處于活動(dòng)狀態(tài),則關(guān)閉當(dāng)前條目。
// 這里的ZipEntry就是一個(gè)條目
// 條目類(lèi):ZipEntry(表示 ZIP 文件條目)
public void putNextEntry(ZipEntry e) throws IOException {}2.
// 關(guān)閉當(dāng)前 ZIP 條目并定位流以寫(xiě)入下一個(gè)條目
public void closeEntry() throws IOException {}ZipOutputStream可以把多份數(shù)據(jù)寫(xiě)入zip包
先創(chuàng)建一個(gè)ZipOutputStream對(duì)象,從中包裝一個(gè)FileOutputStream流,然后每寫(xiě)入一個(gè)文件(條目類(lèi)),先調(diào)用putNextEntry(),然后write()寫(xiě)入byte[]數(shù)據(jù),寫(xiě)入完畢后調(diào)用closeEntry()方法結(jié)束這個(gè)文件的打包。
具體實(shí)現(xiàn)代碼如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 將指定文件寫(xiě)入zip文件
*/
public class Demo02 {
public static void main(String[] args) {
// 原始目錄
File rootDir = new File("d:\\IOTest\\tuji");
// 將原始目錄中的文件,“寫(xiě)入”zip壓縮文件
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {
// 獲取并遍歷原始目錄下的子文件列表
File[] files = rootDir.listFiles();
// 循環(huán)寫(xiě)入每一個(gè)文件
for (File f : files) {
// 創(chuàng)建一個(gè)ZipEntry
out.putNextEntry(new ZipEntry(f.getName()));
// 將源文件的字節(jié)內(nèi)容,寫(xiě)入zip壓縮包
out.write(Files.readAllBytes(f.toPath()));
// 結(jié)束當(dāng)前zipEntry
out.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}到此這篇關(guān)于Java Zip文件讀寫(xiě)操作詳解的文章就介紹到這了,更多相關(guān)Java Zip文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java超過(guò)long類(lèi)型的數(shù)據(jù)表示方法
這篇文章主要給大家介紹Java超過(guò)long類(lèi)型的數(shù)據(jù)如何表示,在 Java 中,如果需要表示超過(guò) long 類(lèi)型范圍的數(shù)據(jù),可以使用 BigInteger 類(lèi),BigInteger 是 Java 提供的一個(gè)用于處理任意精度整數(shù)的類(lèi),它可以表示非常大或非常小的整數(shù),需要的朋友可以參考下2023-09-09
JavaWeb開(kāi)發(fā)基于ssm的校園服務(wù)系統(tǒng)(實(shí)例詳解)
這篇文章主要介紹了JavaWeb開(kāi)發(fā)基于ssm的校園服務(wù)系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Java設(shè)計(jì)模式中的代理設(shè)計(jì)模式詳細(xì)解析
這篇文章主要介紹了Java設(shè)計(jì)模式中的代理設(shè)計(jì)模式詳細(xì)解析,代理模式,重要的在于代理二字,何為代理,我們可以聯(lián)想到生活中的例子,比如秘書(shū)、中介這類(lèi)職業(yè),我們可以委托中介去幫我們完成某些事情,而我們自己只需要關(guān)注我們必須完成的事情,需要的朋友可以參考下2023-12-12
使用java實(shí)現(xiàn)telnet-client工具分享
這篇文章主要介紹了使用java實(shí)現(xiàn)telnet-client工具,需要的朋友可以參考下2014-03-03
Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
java原裝代碼完成pdf在線預(yù)覽和pdf打印及下載
本文主要介紹了java原裝代碼完成pdf在線預(yù)覽和pdf打印及下載的方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
Java使用SFTP上傳文件到服務(wù)器的簡(jiǎn)單使用
這篇文章主要介紹了Java使用SFTP上傳文件到服務(wù)器的簡(jiǎn)單使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
java 運(yùn)行報(bào)錯(cuò)has been compiled by a more recent version of the J
java 運(yùn)行報(bào)錯(cuò)has been compiled by a more recent version of the Java Runtime (class file version 54.0)2021-04-04

