Java實現(xiàn)不解壓讀取zip
來源: https://blog.csdn.net/Peacock__/article/details/92840156
作者: 小李小李彬彬有禮
序
最近在做的功能模塊有遇到下載ZIP文件里的文件內(nèi)容,一開始的想法是先通過代碼執(zhí)行解壓,然后讀取文件內(nèi)容,但是感覺好麻煩,于是度了一下,發(fā)現(xiàn)可以無需解壓直接讀取,而且還是JDK提供給我們的工具。(((o(?▽?)o)))
ZipInputStream
解決方案就是通過ZipInputStream來讀取。
ZipInputStream在JDK中的util包中,而我們平時用的FileInputStream等都是在io包中的。
使用方法如代碼所示:
public static void main(String[] args) throws IOException {
//獲取文件輸入流
FileInputStream input = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\test.zip");
//獲取ZIP輸入流(一定要指定字符集Charset.forName("GBK")否則會報java.lang.IllegalArgumentException: MALFORMED)
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
//定義ZipEntry置為null,避免由于重復(fù)調(diào)用zipInputStream.getNextEntry造成的不必要的問題
ZipEntry ze = null;
//循環(huán)遍歷
while ((ze = zipInputStream.getNextEntry()) != null) {
System.out.println("文件名:" + ze.getName() + " 文件大小:" + ze.getSize() + " bytes");
System.out.println("文件內(nèi)容:");
//讀取
BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream,Charset.forName("GBK")));
String line;
//內(nèi)容不為空,輸出
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
//一定記得關(guān)閉流
zipInputStream.closeEntry();
input.close();
}
控制臺輸出:
文件名:文件1.txt 文件大小:25 bytes
文件內(nèi)容:
213123
edqfdqf
er2523
文件名:文件2.txt 文件大小:14 bytes
文件內(nèi)容:
rfq
e
fqefer
真實使用場景
我真實使用場景是在讀取華為云對象存儲服務(wù)中Bucket中指定.ZIP文件中包含的全部文件內(nèi)容,代碼如下:
華為云官方文檔中給的示例并不能滿足我們下載.ZIP文件,所以有需要的朋友可以參考。
public static void main(String[] args) throws IOException {
//華為云對象存儲認(rèn)證對象
final ObsClient obsClient = new ObsClient(ak, sk, endPoint);
//讀取對象存儲中指定Bucket中的指定文件(test123為Bucket名稱、File.zip為文件名稱)
ObsObject obsObject = obsClient.getObject("test23", "File.zip");
InputStream input = obsObject.getObjectContent();
System.out.println("Object content:");
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input));
//定義ZipEntry,避免由于重復(fù)調(diào)用zipInputStream.getNextEntry造成的不必要的問題
ZipEntry ze = null;
while ((ze = zipInputStream.getNextEntry()) != null) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(zipInputStream));
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
//一定記得關(guān)閉流
zipInputStream.closeEntry();
input.close();
}
讀取數(shù)據(jù)成功
我更新了《10萬字Springboot經(jīng)典學(xué)習(xí)筆記》,點(diǎn)擊下面小卡片,進(jìn)入【Java開發(fā)寶典】,回復(fù):筆記,即可免費(fèi)獲取。
點(diǎn)贊是最大的支持 
我更新了《10萬字Springboot經(jīng)典學(xué)習(xí)筆記》,點(diǎn)擊下面小卡片,進(jìn)入【Java開發(fā)寶典】,回復(fù):筆記,即可免費(fèi)獲取。
點(diǎn)贊是最大的支持
評論
圖片
表情
