利用JAVA打包生成zip文件的類

主要代碼參考了beansoft的ZipUtil,添加了一個方法,
可以把不同目錄文件添加到zip中,並做了一些改進,使用了apache的zip類,(原爲jdk的zip類),使支持中文文件名。
apache的zip類可以從ant中抽取。apache好像沒有提供單獨下載。

package com.order;

import java.io.*;
import java.util.List;
import org.apache.tools.zip.*;

/**
 * 把多個文件打包到一個文件
 * @author xiaofei.hu
 *
 */
public class ZipUtil {

    public static void toZip(File[] files, File zipFile){
        
    }


    /**
     * The buffer.
    */
        protected static byte buf[] = new byte[1024];
        
        
        /**
         * 遍歷目錄並添加文件.
         * @param jos - JAR 輸出流
         * @param file - 目錄文件名
         * @param pathName - ZIP中的目錄名
         * @throws IOException
         * @throws FileNotFoundException
         */
        private static void recurseFiles(ZipOutputStream jos, File file, String pathName)
            throws IOException, FileNotFoundException
        {
            if (file.isDirectory())
            {
                pathName = pathName + file.getName() + "/";
                jos.putNextEntry(new ZipEntry(pathName));
                String fileNames[] = file.list();
                if (fileNames != null)
                {
                    for (int i = 0; i < fileNames.length; i++)
                        recurseFiles(jos, new File(file, fileNames[i]), pathName);
        
                }
            } else
            {
                ZipEntry jarEntry = new ZipEntry(pathName + file.getName());
//                System.out.println(pathName + "  " + file.getName());
                FileInputStream fin = new FileInputStream(file);
                BufferedInputStream in = new BufferedInputStream(fin);
                jos.putNextEntry(jarEntry);
                
                int len;
                while ((len = in.read(buf)) >= 0)
                    jos.write(buf, 0, len);
                in.close();
                jos.closeEntry();
            }
        }
        
        public static void toZip(List<File> files, File zipFile, String zipFolderName, int level)
                        throws IOException, FileNotFoundException
        {
            level = checkZipLevel(level);
            
            if(zipFolderName == null) {
                zipFolderName = "";
            }
            
            ZipOutputStream jos = new ZipOutputStream(new FileOutputStream(zipFile));
            jos.setLevel(level);
            
            
        
            for (int i = 0; i < files.size(); i++){
                recurseFiles(jos, files.get(i), files.get(i).getPath());
            }
        

            jos.close();
            
        }
        
        /**
         * 創建 ZIP/JAR 文件.
         * @param directory - 要添加的目錄
         * @param zipFile - 保存的 ZIP 文件名
         * @param zipFolderName - ZIP 中的路徑名
         * @param level - 壓縮級別(0~9)
         * @throws IOException
         * @throws FileNotFoundException
         */
        public static void makeDirectoryToZip(File directory, File zipFile, String zipFolderName, int level)
            throws IOException, FileNotFoundException
        {
            level = checkZipLevel(level);
            
            if(zipFolderName == null) {
                zipFolderName = "";
            }
            
            ZipOutputStream jos = new ZipOutputStream(new FileOutputStream(zipFile));
            jos.setLevel(level);
            
            String fileNames[] = directory.list();
            if (fileNames != null)
            {
                for (int i = 0; i < fileNames.length; i++)
                    recurseFiles(jos, new File(directory, fileNames[i]), zipFolderName);
        
            }
            jos.close();
        }
        
        /**
         * 檢查並設置有效的壓縮級別.
         * @param level - 壓縮級別
         * @return 有效的壓縮級別或者默認壓縮級別
         */
        public static int checkZipLevel(int level)
        {
            if(level < 0 || level > 9) level = 7;
            return level;
        }
        
}

 

文章來源:http://huxiaofei590.blog.163.com/blog/static/3259612200711457331

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章