Java無需解壓直接讀取ZIP壓縮包里的文件及內容
Java無需解壓直接讀取ZIP壓縮包里的文件及內容
jar vs zip:
jar 文件和 zip 文件都是歸檔文件,并且都經過壓縮。事實上,jar 文件使用與 zip 文件相同的存檔和壓縮技術,所以 jar 文件實際上是一種特定類型的 zip 文件。(JAR 文件本質上是一個包含可選 META-INF 目錄的 zip 文件。)這一切都意味著:
您可以使用與打開 zip 文件相同的工具打開 jar 文件
jar 文件是 zip 文件的子集,因此如果 zip 文件遵循 jar 規(guī)范,則它可以用作 jar 文件。
最近開發(fā)的時候遇到要獲取到zip壓縮包里面的文件內容,一開始的想法是先通過代碼執(zhí)行解壓,然后讀取文件內容,但是感覺好麻煩,于是度了一下,發(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,避免由于重復調用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ù)進行相關處理 ...... } } } //一定記得關閉流 zipInputStream.closeEntry(); input.close(); }
補充:
java 直接讀取zip文件和文件內容
不解壓zip文件,直接讀取zip包內的文件夾以及文件內容
zip包內內容:
代碼如下:
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(); } }
到此這篇關于Java無需解壓直接讀取ZIP壓縮包里的文件及內容的文章就介紹到這了,更多相關java讀取zip壓縮包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)
這篇文章主要介紹了IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Spring?Boot中application配置文件的生效順序及應用范圍
Spring?Boot的一個重要特性就是它的自動配置,這一特性在很大程度上依賴于名稱為application的配置文件,本文將詳細介紹在Spring?Boot中,這些配置文件的加載順序以及每份文件的應用范圍,需要的朋友可以參考下2024-03-03Java 圖解Spring啟動時的后置處理器工作流程是怎樣的
spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期2021-10-10SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式)
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式),需要的朋友可以參考下2025-01-01