最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中如何讀取和寫入zip文件問題

 更新時間:2024年06月14日 09:23:57   作者:仙草不加料  
這篇文章主要介紹了Java中如何讀取和寫入zip文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Java讀取和寫入zip文件

在我們?nèi)粘J褂弥校瑉ip壓縮文件是非常常用的,市面上也有許多壓縮軟件,那么我們?yōu)槭裁匆胘ava去操作zip,使用壓縮軟件不香嗎?

其實試想有這樣一個需求,在這個項目中,有上傳功能,如果要上傳多個文件,這樣頻繁的操作遠遠不如上傳一個壓縮包方便,上傳后如果要操作這些壓縮包里的文件,用IO流不就方便多了。

因此就得先了解ZipInputStream類和ZipOutputStream類。

  • ZipInputStream:繼承自FilterInputStream類,采用了裝飾器模式,可以直接讀取zip包中的內(nèi)容, 內(nèi)部封裝有ZipEntry類型的屬性,在讀取zip文件內(nèi)部子文件時,調(diào)用getNextEntry()方法時,每個ZipEntry對象就是每個子文件。
  • ZipOutputStream:繼承自FilterOutputStream類,采用了裝飾器模式,可以直接寫入內(nèi)容到zip包中, 內(nèi)部同樣封裝有ZipEntry類型的屬性,但是在寫入Zip壓縮文件時,調(diào)用putNextEntry()方法,需要把每個子文件作為ZipEntry對象傳入。

讀取Zip包(解壓縮)

首先要創(chuàng)建解壓縮目錄targetDir,通常是與zip文件在同一個目錄下,通過用zip文件的父目錄與zip文件的文件名作為數(shù)據(jù)源,并調(diào)用mkdir()方法創(chuàng)建目錄。

第二步就是解析并讀取zip壓縮文件,創(chuàng)建一個ZipInputStream,傳入一個FileInputStream作為數(shù)據(jù)源,然后循環(huán)調(diào)用getNextEntry(),遍歷zip文件每個子文件,每次循環(huán)獲取子文件的文件名并創(chuàng)建該文件的輸出流,調(diào)用write()方法,讀取文件內(nèi)容并寫入輸出流。

代碼如下:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
 
 
public class Demo01 {
	public static void main(String[] args) {
		// 要進行解壓縮的zip文件
		File zipFile = new File("D:\\test\\1-201023201325.zip");
 
		// 1.創(chuàng)建解壓縮目錄
		// 獲取zip文件的名稱
		String zipFileName = zipFile.getName();
 
		// 根據(jù)zip文件名稱,提取壓縮文件目錄
		String targetDirName = zipFileName.substring(0, zipFileName.indexOf("."));
 
		// 創(chuàng)建解壓縮目錄
		File targetDir = new File(zipFile.getParent() + "\\" + targetDirName);
 
		if (!targetDir.exists()) {
			targetDir.mkdir(); // 創(chuàng)建目錄
		}
 
		// 2.解析讀取zip文件
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("gbk"))) {
			// 遍歷zip文件中的每個子文件
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				// 獲取zip壓縮包中的子文件名稱
				String zipEntryFileName = zipEntry.getName();
 
				// 創(chuàng)建該文件的輸出流
				String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;
				
				// 輸出流定義在try()塊,結(jié)束自動清空緩沖區(qū)并關閉
				try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath))) {
 
					// 讀取該子文件的字節(jié)內(nèi)容
					byte[] buff = new byte[1024];
					int len = -1;
					while ((len = in.read(buff)) != -1) {
						bos.write(buff, 0, len);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

寫入zip包(壓縮)

首先創(chuàng)建File對象rootDir引用原始目錄,然后創(chuàng)建一個ZipOutputStream,傳入一FileOutputStream作為數(shù)據(jù)源,調(diào)用listFiles()方法,獲取并遍歷原始目錄下的子文件列表,每次循環(huán)創(chuàng)建一個ZipEntry,每寫入一個文件前,調(diào)用putNextEntry()方法,然后將原文件的字節(jié)內(nèi)容,寫入zip壓縮包,需要注意,每次寫完文件,必須調(diào)用closeEntry()結(jié)束當前ZipEntry。

代碼如下:

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;
 
public class Demo02 {
	public static void main(String[] args) {
		// 原始目錄
		File rootDir = new File("D:\\test\\20220529");
		System.out.println(rootDir.getAbsolutePath());
		// 將原始目錄中的文件,“寫入”zip壓縮文件
		try (ZipOutputStream out = new ZipOutputStream(
				new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {
			// 獲取并遍歷原始目錄下的子文件列表
			File[] files = rootDir.listFiles();
			for (File f : files) {
				// 創(chuàng)建一個ZipEntry
				out.putNextEntry(new ZipEntry(f.getName()));
 
				// 將原文件的字節(jié)內(nèi)容,寫入zip壓縮包
				out.write(Files.readAllBytes(f.toPath()));
 
				// 結(jié)束當前ZipEntry
				out.closeEntry();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java實現(xiàn)簡單學生成績檔案管理系統(tǒng)

    java實現(xiàn)簡單學生成績檔案管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單學生成績檔案管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解DES加密算法及在Java程序中的使用示例

    詳解DES加密算法及在Java程序中的使用示例

    這篇文章主要介紹了詳解DES加密算法及在Java程序中的使用示例,文中還有一個用Java實現(xiàn)的DES三重加密的例子,需要的朋友可以參考下
    2016-04-04
  • Spring MVC中處理ajax請求的跨域問題與注意事項詳解

    Spring MVC中處理ajax請求的跨域問題與注意事項詳解

    跨域問題是我們大家在開發(fā)中會經(jīng)常遇到的一個問題,所以下面這篇文章主要給大家介紹了關于Spring MVC中處理ajax請求的跨域問題與注意事項的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11
  • BigDecimal divide除法除不盡報錯的問題及解決

    BigDecimal divide除法除不盡報錯的問題及解決

    這篇文章主要介紹了BigDecimal divide除法除不盡報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 利用Java實現(xiàn)帶GUI的氣泡詩詞特效

    利用Java實現(xiàn)帶GUI的氣泡詩詞特效

    這篇文章主要為大家介紹了如何利用Java語言實現(xiàn)帶GUI的氣泡詩詞特效,文中的示例代碼講解詳細,對我們學習Java有一定幫助,感興趣的可以了解一下
    2022-08-08
  • 淺談spring中scope作用域

    淺談spring中scope作用域

    這篇文章主要介紹了淺談spring中scope作用域,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細介紹

    JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細介紹

    這篇文章主要介紹了JAVA加密算法- 非對稱加密算法(DH,RSA),詳細介紹了DH,RSA的用法和示例,需要的朋友可以了解一下。
    2016-11-11
  • log4j2的高并發(fā)死鎖問題配置優(yōu)化方式

    log4j2的高并發(fā)死鎖問題配置優(yōu)化方式

    這篇文章主要介紹了log4j2的高并發(fā)死鎖問題配置優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot如何使用自定義注解實現(xiàn)接口限流

    SpringBoot如何使用自定義注解實現(xiàn)接口限流

    這篇文章主要介紹了SpringBoot如何使用自定義注解實現(xiàn)接口限流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java根據(jù)日期截取字符串的多種實現(xiàn)方法

    Java根據(jù)日期截取字符串的多種實現(xiàn)方法

    在實際開發(fā)中,我們經(jīng)常會遇到需要根據(jù)日期來截取字符串的需求,例如從文件名中提取日期信息,Java 提供了多種方法來實現(xiàn)根據(jù)日期來截取字符串的功能,本文將給大家介紹了Java根據(jù)日期截取字符串的多種實現(xiàn)方法,需要的朋友可以參考下
    2024-11-11

最新評論

偃师市| 富源县| 外汇| 怀柔区| 黔西县| 绥阳县| 酒泉市| 蕲春县| 大渡口区| 措勤县| 定安县| 库车县| 平凉市| 贵港市| 宁远县| 托里县| 仙桃市| 新巴尔虎右旗| 扶风县| 林口县| 罗江县| 威远县| 明星| 泽州县| 宜都市| 稻城县| 聂荣县| 黄陵县| 疏附县| 永昌县| 宕昌县| 凤庆县| 德令哈市| 柏乡县| 新巴尔虎右旗| 苍溪县| 红安县| 吐鲁番市| 五峰| 乐陵市| 巴南区|