溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮

發(fā)布時間:2021-02-25 14:33:02 來源:億速云 閱讀:225 作者:戴恩恩 欄目:開發(fā)技術(shù)

這篇文章主要介紹了如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮,億速云小編覺得不錯,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨億速云小編來看看吧!

Java是什么

Java是一門面向?qū)ο缶幊陶Z言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。

zip壓縮

待壓縮文件目錄結(jié)構(gòu):

如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮

每個zip文件項都要對應(yīng)一個ZipEntry,然后通過ZipOutputStream的putNextEntry方法開始寫入一個新的zip文件項,將文件數(shù)據(jù)發(fā)送到zip輸出流中,完成后再調(diào)用closeEntry方法。

@Test
public void testCompressByZip() {
	try (
		//指定壓縮完成后zip文件的存儲路徑
		ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("F:\\myFavorites.zip"))
	)
	{
		//待壓縮文件/目錄所在的目錄
		File fileFolder = new File("F:\\我的收藏");
		//獲取目錄下的所有文件
		File[] files = fileFolder.listFiles();

		ZipEntry zipEntry;
		byte[] byteArray;
		int len;
		//遍歷目錄下的所有文件/目錄,并將它們添加到壓縮文件中
		for (File file : files) {
			//一個ZipEntry對應(yīng)壓縮文件中的一項
			zipEntry = new ZipEntry(file.getName());
			zipOutputStream.putNextEntry(zipEntry);
			try (FileInputStream in = new FileInputStream(file)) {
				byteArray = new byte[1024];
				while ((len = in.read(byteArray)) != -1) {
					zipOutputStream.write(byteArray, 0, len);
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
			zipOutputStream.closeEntry();
		}
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

壓縮結(jié)果:

如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮

zip解壓縮

遍歷zip文件中的所有項,并獲取對應(yīng)項的輸入流,然后通過FileOutputStream輸出到指定目錄中。

@Test
public void testDecompressByZip() {
	try (
		//指定需要解壓縮的zip文件
		ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("F:\\myFavorites.zip"))
	)
	{
		ZipEntry zipEntry;
		byte[] byteArray;
		int len;
		//遍歷zip文件中的所有項,并逐個解壓到指定的目錄中
		while ((zipEntry = zipInputStream.getNextEntry()) != null) {
			try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\我的解壓目錄\\" + zipEntry.getName())) {
				byteArray = new byte[1024];
				while ((len = zipInputStream.read(byteArray)) != -1) {
					fileOutputStream.write(byteArray, 0, len);
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

解壓縮結(jié)果:

如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮

使用FileSystem解壓縮

  • 建立一個文件系統(tǒng),包含zip文件中的所有項。

  • 遍歷zip文件中的所有項,通過文件訪問器SimpleFileVisitor將每個項復(fù)制到指定目錄中。

@Test
public void testDecompressByZip2(){
	try {
		//將壓縮文件作為一個文件系統(tǒng)訪問
		FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\\myFavorites.zip"), null);
		//遍歷壓縮文件中的內(nèi)容,并使用文件訪問器訪問所有內(nèi)容
		Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor<Path>() {
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				System.out.println("訪問目錄中文件時調(diào)用");
				//將文件解壓到指定目錄
				Files.copy(file, new FileOutputStream("F:\\我的解壓目錄\\" + file.getName(file.getNameCount() - 1)));
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
				System.out.println("訪問目錄中文件之前調(diào)用");
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
				System.out.println("訪問目錄中文件失敗時調(diào)用");
				return FileVisitResult.SKIP_SUBTREE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
				System.out.println("訪問目錄中的文件及其所有后代之后調(diào)用");
				return FileVisitResult.CONTINUE;
			}
		});
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

以上就是億速云小編為大家收集整理的如何在Java中利用zip實(shí)現(xiàn)壓縮和解壓縮,如何覺得億速云網(wǎng)站的內(nèi)容還不錯,歡迎將億速云網(wǎng)站推薦給身邊好友。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI