1. 程式人生 > >Java ZIP壓縮輸入輸出流

Java ZIP壓縮輸入輸出流

    ZIP是一種較為常見的壓縮形式,在Java中要想實現ZIP的壓縮需要匯入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry幾個類完成。

ZipOutputStream類的常用方法


ZipInputStream類的常用方法


在JAVA IO中,不僅可以實現ZIP壓縮格式的輸入、輸出,也可以實現JAR及GZIP檔案格式的壓縮
 1、JAR壓縮的支援類儲存在java.util.jar包中,常用的類有 JarOutputStream(JAR壓縮輸出流)、JarInputStream(JAR壓縮輸入流)、JARFile(JAR檔案)、JAREntry(JAR實體)

2、GZIP是用於UNIX系統的檔案壓縮,在Linux中經常會使用到*.gz的檔案,就是GZIP格式,GZIP壓縮的支援類儲存在java.util.zip包中,常用的類有  GZIPOutputStream(GZIP壓縮輸出流)、GZIPInputStream(GZIP壓縮輸入流)

注意:
1、壓縮檔案中的每一個壓縮實體都使用ZipEntry儲存,一個壓縮檔案中可能包含一個或多個ZipEntry物件。
2、在JAVA中可以進行zip、jar、gz三種格式的壓縮支援,操作流程基本上是一致的。
3、ZipOutputStream可以進行壓縮的輸出,但是輸出的位置不一定是檔案。
4、ZipFile表示每一個壓縮檔案,可以得到每一個壓縮實體的輸入流。

壓縮檔案

import java.io.*;
import java.util.zip.*;

public class MyZip { // 建立類
	private void zip(String zipFileName, File inputFile) throws Exception {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
				zipFileName)); // 建立ZipOutputStream類物件
		zip(out, inputFile, ""); // 呼叫方法
		System.out.println("壓縮中…"); // 輸出資訊
		out.close(); // 將流關閉
	}
	
	private void zip(ZipOutputStream out, File f, String base)
			throws Exception { // 方法過載
		if (f.isDirectory()) { // 測試此抽象路徑名錶示的檔案是否是一個目錄
			File[] fl = f.listFiles(); // 獲取路徑陣列
			out.putNextEntry(new ZipEntry(base + "/")); // 寫入此目錄的entry
			base = base.length() == 0 ? "" : base + "/"; // 判斷引數是否為空
			for (int i = 0; i < fl.length; i++) { // 迴圈遍歷陣列中檔案
				zip(out, fl[i], base + fl[i]);
			}
		} else {
			out.putNextEntry(new ZipEntry(base)); // 建立新的進入點
			// 建立FileInputStream物件
			FileInputStream in = new FileInputStream(f);
			int b; // 定義int型變數
			System.out.println(base);
			while ((b = in.read()) != -1) { // 如果沒有到達流的尾部
				out.write(b); // 將位元組寫入當前ZIP條目
			}
			in.close(); // 關閉流
		}
	}
	
	public static void main(String[] temp) { // 主方法
		MyZip book = new MyZip(); // 建立本例物件
		try {
			// 呼叫方法,引數為壓縮後文件與要壓縮檔案
			book.zip("hello.zip", new File("src"));
			System.out.println("壓縮完成"); // 輸出資訊
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

解壓檔案

import java.io.*;
import java.util.zip.*;

public class Decompressing { // 建立檔案
	public static void main(String[] temp) {
		ZipInputStream zin; // 建立ZipInputStream物件
		try { // try語句捕獲可能發生的異常
			zin = new ZipInputStream(new FileInputStream("hello.zip"));
			// 例項化物件,指明要進行解壓的檔案
			ZipEntry entry = zin.getNextEntry(); // 獲取下一個ZipEntry
			while (((entry = zin.getNextEntry()) != null)
					&& !entry.isDirectory()) {
				// 如果entry不為空,並不在同一目錄下
				File file = new File("d:\\" + entry.getName()); // 獲取檔案目錄
				System.out.println(file);
				if (!file.exists()) { // 如果該檔案不存在
					file.mkdirs();// 建立檔案所在資料夾
					file.createNewFile(); // 建立檔案
				}
				zin.closeEntry(); // 關閉當前entry
				System.out.println(entry.getName() + "解壓成功");
			}
			zin.close(); // 關閉流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}