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

Java中如何讀取和寫(xiě)入zip文件問(wèn)題

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

Java讀取和寫(xiě)入zip文件

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

其實(shí)試想有這樣一個(gè)需求,在這個(gè)項(xiàng)目中,有上傳功能,如果要上傳多個(gè)文件,這樣頻繁的操作遠(yuǎn)遠(yuǎn)不如上傳一個(gè)壓縮包方便,上傳后如果要操作這些壓縮包里的文件,用IO流不就方便多了。

因此就得先了解ZipInputStream類(lèi)和ZipOutputStream類(lèi)。

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

讀取Zip包(解壓縮)

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

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

代碼如下:

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) {
		// 要進(jìn)行解壓縮的zip文件
		File zipFile = new File("D:\\test\\1-201023201325.zip");
 
		// 1.創(chuàng)建解壓縮目錄
		// 獲取zip文件的名稱(chēng)
		String zipFileName = zipFile.getName();
 
		// 根據(jù)zip文件名稱(chēng),提取壓縮文件目錄
		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文件中的每個(gè)子文件
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				// 獲取zip壓縮包中的子文件名稱(chēng)
				String zipEntryFileName = zipEntry.getName();
 
				// 創(chuàng)建該文件的輸出流
				String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;
				
				// 輸出流定義在try()塊,結(jié)束自動(dòng)清空緩沖區(qū)并關(guān)閉
				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();
		}
	}
}

寫(xiě)入zip包(壓縮)

首先創(chuàng)建File對(duì)象rootDir引用原始目錄,然后創(chuàng)建一個(gè)ZipOutputStream,傳入一FileOutputStream作為數(shù)據(jù)源,調(diào)用listFiles()方法,獲取并遍歷原始目錄下的子文件列表,每次循環(huán)創(chuàng)建一個(gè)ZipEntry,每寫(xiě)入一個(gè)文件前,調(diào)用putNextEntry()方法,然后將原文件的字節(jié)內(nèi)容,寫(xiě)入zip壓縮包,需要注意,每次寫(xiě)完文件,必須調(diào)用closeEntry()結(jié)束當(dāng)前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());
		// 將原始目錄中的文件,“寫(xiě)入”zip壓縮文件
		try (ZipOutputStream out = new ZipOutputStream(
				new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {
			// 獲取并遍歷原始目錄下的子文件列表
			File[] files = rootDir.listFiles();
			for (File f : files) {
				// 創(chuàng)建一個(gè)ZipEntry
				out.putNextEntry(new ZipEntry(f.getName()));
 
				// 將原文件的字節(jié)內(nèi)容,寫(xiě)入zip壓縮包
				out.write(Files.readAllBytes(f.toPath()));
 
				// 結(jié)束當(dāng)前ZipEntry
				out.closeEntry();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
}

總結(jié)

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

相關(guān)文章

最新評(píng)論

耒阳市| 金堂县| 大城县| 拉萨市| 闻喜县| 奎屯市| 天气| 乐业县| 兴海县| 股票| 宜城市| 平南县| 泽州县| 花莲县| 杭州市| 林甸县| 长海县| 朝阳县| 长汀县| 陆河县| 阳新县| 浮梁县| 闵行区| 信宜市| 台前县| 辽宁省| 昭苏县| 桦甸市| 丹凤县| 靖江市| 商南县| 开化县| 宁化县| 万安县| 莱西市| 桓仁| 侯马市| 安陆市| 柳河县| 望谟县| 侯马市|