天天看點

Java實作zip檔案壓縮(單個檔案、檔案夾以及檔案和檔案夾的組合壓縮)

Java實作zip檔案壓縮(單個檔案、檔案夾以及檔案和檔案夾的組合壓縮)

package com.ljheee.ziptool.core;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 壓縮算法類
 * 實作檔案壓縮,檔案夾壓縮,以及檔案和檔案夾的混合壓縮
 * @author ljheee
 *
 */
public class CompactAlgorithm {

	/**
	 * 完成的結果檔案--輸出的壓縮檔案
	 */
	File targetFile;
	
	public CompactAlgorithm() {}
	
	public CompactAlgorithm(File target) {
		targetFile = target;
		if (targetFile.exists())
			targetFile.delete();
	}

	/**
	 * 壓縮檔案
	 * 
	 * @param srcfile
	 */
	public void zipFiles(File srcfile) {

		ZipOutputStream out = null;
		try {
			out = new ZipOutputStream(new FileOutputStream(targetFile));
			
			if(srcfile.isFile()){
				zipFile(srcfile, out, "");
			} else{
				File[] list = srcfile.listFiles();
				for (int i = 0; i < list.length; i++) {
					compress(list[i], out, "");
				}
			}
			
			System.out.println("壓縮完畢");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 壓縮檔案夾裡的檔案
	 * 起初不知道是檔案還是檔案夾--- 統一調用該方法
	 * @param file
	 * @param out
	 * @param basedir
	 */
	private void compress(File file, ZipOutputStream out, String basedir) {
		/* 判斷是目錄還是檔案 */
		if (file.isDirectory()) {
			this.zipDirectory(file, out, basedir);
		} else {
			this.zipFile(file, out, basedir);
		}
	}

	/**
	 * 壓縮單個檔案
	 * 
	 * @param srcfile
	 */
	public void zipFile(File srcfile, ZipOutputStream out, String basedir) {
		if (!srcfile.exists())
			return;

		byte[] buf = new byte[1024];
		FileInputStream in = null;

		try {
			int len;
			in = new FileInputStream(srcfile);
			out.putNextEntry(new ZipEntry(basedir + srcfile.getName()));

			while ((len = in.read(buf)) > 0) {
				out.write(buf, 0, len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.closeEntry();
				if (in != null)
					in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 壓縮檔案夾
	 * @param dir
	 * @param out
	 * @param basedir
	 */
	public void zipDirectory(File dir, ZipOutputStream out, String basedir) {
		if (!dir.exists())
			return;

		File[] files = dir.listFiles();
		for (int i = 0; i < files.length; i++) {
			/* 遞歸 */
			compress(files[i], out, basedir + dir.getName() + "/");
		}
	}

	
	//測試
	public static void main(String[] args) {
		File f = new File("E:/Study/Java");
		new CompactAlgorithm(new File( "D:/test",f.getName()+".zip")).zipFiles(f);
	}

}
           

        完整工程實作界面化,通過界面完成對檔案的壓縮和解壓,如下圖:

Java實作zip檔案解壓[到指定目錄]:http://blog.csdn.net/ljheee/article/details/52736091

Java實作zip檔案壓縮(單個檔案、檔案夾以及檔案和檔案夾的組合壓縮)

完整工程:https://github.com/ljheee/MyZip1.0