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,避免由于重復(fù)調(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ù)進(jìn)行相關(guān)處理
......
}
}
}
//一定記得關(guān)閉流
zipInputStream.closeEntry();
input.close();
}補(bǔ)充:
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)文章
IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)
這篇文章主要介紹了IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Spring?Boot中application配置文件的生效順序及應(yīng)用范圍
Spring?Boot的一個重要特性就是它的自動配置,這一特性在很大程度上依賴于名稱為application的配置文件,本文將詳細(xì)介紹在Spring?Boot中,這些配置文件的加載順序以及每份文件的應(yīng)用范圍,需要的朋友可以參考下2024-03-03
Java 圖解Spring啟動時的后置處理器工作流程是怎樣的
spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期2021-10-10
Java生成隨機(jī)姓名、性別和年齡的實現(xiàn)示例
這篇文章主要介紹了Java生成隨機(jī)姓名、性別和年齡的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式)
WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議,WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式),需要的朋友可以參考下2025-01-01

