Java無需解壓直接讀取ZIP壓縮包里的文件及內(nèi)容
Java無需解壓直接讀取ZIP壓縮包里的文件及內(nèi)容
jar vs zip:
jar 文件和 zip 文件都是歸檔文件,并且都經(jīng)過壓縮。事實上,jar 文件使用與 zip 文件相同的存檔和壓縮技術(shù),所以 jar 文件實際上是一種特定類型的 zip 文件。(JAR 文件本質(zhì)上是一個包含可選 META-INF 目錄的 zip 文件。)這一切都意味著:
您可以使用與打開 zip 文件相同的工具打開 jar 文件
jar 文件是 zip 文件的子集,因此如果 zip 文件遵循 jar 規(guī)范,則它可以用作 jar 文件。
最近開發(fā)的時候遇到要獲取到zip壓縮包里面的文件內(nèi)容,一開始的想法是先通過代碼執(zhí)行解壓,然后讀取文件內(nèi)容,但是感覺好麻煩,于是度了一下,發(fā)現(xiàn)可以無需解壓直接讀取,而且還是JDK提供給我們的工具。
解決方案就是通過ZipInputStream來讀取。
ZipInputStream在JDK中的util包中,而我們平時用的FileInputStream等都是在io包中的。
示例如下:
@Test
public void test() throws Exception {
//獲取文件輸入流
FileInputStream input = new FileInputStream("D:\\2022-03-28.zip");
//獲取ZIP輸入流(一定要指定字符集Charset.forName("GBK")否則會報java.lang.IllegalArgumentException: MALFORMED)
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
//定義ZipEntry置為null,避免由于重復調(diào)用zipInputStream.getNextEntry造成的不必要的問題
ZipEntry ze;
List<List<Object>> list;
//循環(huán)遍歷
while ((ze = zipInputStream.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (!ze.isDirectory() && ze.toString().endsWith("xls")) {
//讀取
byte[] buffer = new byte[1024];
int len;
while ((len = zipInputStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
InputStream stream = new ByteArrayInputStream(baos.toByteArray()); //excel 流
//根據(jù)excel輸入流讀取EXCEL中的數(shù)據(jù)
ExcelReader excelReader = ExcelUtil.getReader(stream);
list = excelReader.read(2, excelReader.getRowCount());
for(List<Object> objList : list){
objList.get(0);
objList.get(1);
//獲取到數(shù)據(jù)進行相關(guān)處理
......
}
}
}
//一定記得關(guān)閉流
zipInputStream.closeEntry();
input.close();
}補充:
java 直接讀取zip文件和文件內(nèi)容
不解壓zip文件,直接讀取zip包內(nèi)的文件夾以及文件內(nèi)容
zip包內(nèi)內(nèi)容:

代碼如下:
import java.io.*;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
public class ReadFile {
public static void main(String[] args) throws IOException {
String path = "F:\\*******\\201707\\78641695079026649.zip";
ZipFile zf = new ZipFile(path);
InputStream in = new BufferedInputStream(new FileInputStream(path));
Charset gbk = Charset.forName("gbk");
ZipInputStream zin = new ZipInputStream(in,gbk);
ZipEntry ze;
while((ze = zin.getNextEntry()) != null){
if(ze.toString().endsWith("txt")){
BufferedReader br = new BufferedReader(
new InputStreamReader(zf.getInputStream(ze)));
String line;
while((line = br.readLine()) != null){
System.out.println(line.toString());
}
br.close();
}
System.out.println();
}
zin.closeEntry();
}
}到此這篇關(guān)于Java無需解壓直接讀取ZIP壓縮包里的文件及內(nèi)容的文章就介紹到這了,更多相關(guān)java讀取zip壓縮包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文掌握Spring Cookie和Session 是什么及區(qū)別介紹
Cookie和Session都是用于在客戶端和服務器之間傳遞信息的技術(shù),但它們的工作方式和使用場景有所不同,Cookie是在客戶端保存用戶信息的一種機制,而Session是在服務器端保存用戶信息的一種機制,本文介紹Spring Cookie和Session 是什么,感興趣的朋友一起看看吧2025-01-01
java實現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化
這篇文章主要為大家詳細介紹了java實現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
簡單談談SpringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別
下面小編就為大家?guī)硪黄唵握務凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
windows后臺運行Java jar包實現(xiàn)方式
本文記錄了一個在Windows上運行Java程序,并讓其后臺運行的方法,通過創(chuàng)建start.txt和shutdown.txt文件,并將其后綴名改為bat,可以實現(xiàn)程序的啟動和停止2026-04-04
Java中char[] 和 String 類型占用字節(jié)大小問題
這篇文章主要介紹了Java中char[] 和 String 類型占用字節(jié)大小問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
基于Springboot實現(xiàn)JWT認證的示例代碼
本文主要介紹了基于Springboot實現(xiàn)JWT認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
使用Java實現(xiàn)查看線程的運行狀態(tài)(附源碼)
在現(xiàn)代 Java 應用中,線程的運行狀態(tài)對于排查問題和優(yōu)化性能具有至關(guān)重要的作用,本文將使用Java編寫一個查看線程運行狀態(tài)的工具,有需要的可以了解下2025-03-03

