1. 程式人生 > >Java ZIP壓縮文件使用總結

Java ZIP壓縮文件使用總結

except println cfi cto 分享圖片 使用總結 開發 ioe input

做Java Web開發,有時候遇到將多個文件或者文件夾壓縮成一個.zip文件,供前端下載。Java的JDK中提供一個java.util.zip的接口,供大家使用。如下圖:

技術分享圖片

圖上就是Java 的JDK提供的接口,但是壓縮文件或者文件夾的時候,怎麽使用上面的接口呢?下面我給出幾個相關的接口,這些接口是下面壓縮文件或者文件夾過程中使用到的。

java.util.zip.ZipEntry;
java.util.zip.ZipOutputStream;

下面的壓縮過程主要是通過這兩個接口壓縮文件或者文件夾;

下面先給出源碼,後面詳細介紹的接口中的方法:

package ZIPUtil;

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

/**
 * 學習使用java.util.zip壓縮文件或者文件夾
 * @author lhm
 *
 */

public class ZIPUtil {

	/**
	 * @param args 主方法
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//第一個參數是需要壓縮的源路徑;第二個參數是壓縮文件的目的路徑,這邊需要將壓縮的文件名字加上去
		compress("H:\\zip/scala","H:\\zip/oo.zip");
	}

	/**s
	 * 壓縮文件
	 * @param srcFilePath 壓縮源路徑 
	 * @param destFilePath 壓縮目的路徑
	 */
	public static void compress(String srcFilePath, String destFilePath) {
		//
        File src = new File(srcFilePath);

        if (!src.exists()) {
            throw new RuntimeException(srcFilePath + "不存在");
        }
        File zipFile = new File(destFilePath);

        try {

            FileOutputStream fos = new FileOutputStream(zipFile);
            ZipOutputStream zos = new ZipOutputStream(fos);
            String baseDir = "";
            compressbyType(src, zos, baseDir);
            zos.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }
	/**
	 * 按照原路徑的類型就行壓縮。文件路徑直接把文件壓縮,
	 * @param src 
	 * @param zos
	 * @param baseDir
	 */
	 private static void compressbyType(File src, ZipOutputStream zos,String baseDir) {

	        if (!src.exists())
	            return;
	        System.out.println("壓縮路徑" + baseDir + src.getName());
	        //判斷文件是否是文件,如果是文件調用compressFile方法,如果是路徑,則調用compressDir方法;
	        if (src.isFile()) {
	        	//src是文件,調用此方法
	            compressFile(src, zos, baseDir);
	            
	        } else if (src.isDirectory()) {
	        	//src是文件夾,調用此方法
	            compressDir(src, zos, baseDir);

	        }

	    }
	 
	    /**
	     * 壓縮文件
	    */
	    private static void compressFile(File file, ZipOutputStream zos,String baseDir) {
	        if (!file.exists())
	            return;
	        try {
	            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
	            ZipEntry entry = new ZipEntry(baseDir + file.getName());
	            zos.putNextEntry(entry);
	            int count;
	            byte[] buf = new byte[1024];
	            while ((count = bis.read(buf)) != -1) {
	                zos.write(buf, 0, count);
	            }
	            bis.close();

	        } catch (Exception e) {
	          // TODO: handle exception

	        }
	    }
	    
	    /**
	     * 壓縮文件夾
	     */
	    private static void compressDir(File dir, ZipOutputStream zos,String baseDir) {
	        if (!dir.exists())
	            return;
	        File[] files = dir.listFiles();
	        if(files.length == 0){
	            try {
	                zos.putNextEntry(new ZipEntry(baseDir + dir.getName()+File.separator));
	            } catch (IOException e) {
	                e.printStackTrace();
	            }
	        }
	        for (File file : files) {
	            compressbyType(file, zos, baseDir + dir.getName() + File.separator);
	        }
	}
}

  java.util.zip-壓縮流程:

先將文件加載到文件流FileInputStream中,再將文件流輸入到ZipOutputStream;

源文件路徑:H:\\zip/scala,目的壓縮文件zip的路徑:H:\\zip/oo.zip

技術分享圖片

Java ZIP壓縮文件使用總結