Java文件压缩

来源:互联网 发布:php文件缓存 编辑:程序博客网 时间:2024/05/18 01:13
package com.tgod.core.utils;


/**
 * Created by wanghh on 2016/12/6 0006.
 */


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;


import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


import com.tgod.album.model.TgodPhotoalbum;
import com.tgod.album.model.TgodPhotoalbumtmp;
import com.tgod.core.model.Constant;










public class ZipUtil {
    private static byte[] _byte = new byte[1024];


    /**
     * 压缩文件或路径
     *
     * @param zip      压缩的目标url
     * @param srcFiles 压缩的源文件list,可以为文件夹或多个文件
     * @throws IOException 
     *
     */
    public synchronized static  int zipFile(String zip, List<File> srcFiles) throws IOException {
        int i = 0;
        System.out.println("create zip file1:"+zip);
       // try {
            //if (zip.endsWith(".zip") || zip.endsWith(".ZIP")) {
            System.out.println("进入zip压缩循环");
                File zipFile = new File(zip);
                if(zipFile.exists()){
                zipFile.delete();//如果压缩包存在则删除压缩包重新生成
                }
                if(!zipFile.getParentFile().exists()){
                    zipFile.getParentFile().mkdirs();
                }
                ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
                //_zipOut.setEncoding("GBK");
                for (File _f : srcFiles) {
                System.out.println("create zip file:_f"+_f);
                    i = handlerFile(zip, _zipOut, _f, "");
                  
                }
                
                _zipOut.close();
                System.out.println("create zip file:"+zip);
          /*  } else {
                System.out.println("target file[" + zip + "] is not .zip type file");
            }*/
      //  } catch (FileNotFoundException e) {
      //  } catch (IOException e) {
      //  }
        return i;
    }


    /**
     * @param zip     压缩的目标文件url
     * @param zipOut  编码
     * @param srcFile 被压缩的文件名称
     * @param path    在zip中的相对路径
     * @throws IOException
     */
    public static int handlerFile(String zip, ZipOutputStream zipOut, File srcFile, String path) throws IOException {
        int i = 0;
       // System.out.println(" begin to compression file[" + srcFile.getName() + "]");
        if (!"".equals(path) && !path.endsWith(File.separator)) {
            path += File.separator;
        }
        if (!srcFile.getPath().equals(zip)) {
            if (srcFile.isDirectory()) {
                File[] _files = srcFile.listFiles();
                if (_files.length == 0) {
                    zipOut.putNextEntry(new ZipEntry(path + srcFile.getName() + File.separator));
                    zipOut.closeEntry();
                } else {
                    for (File _f : _files) {
                        handlerFile(zip, zipOut, _f, path + srcFile.getName());
                        i++;
                    }
                }
            } else {
                InputStream _in = new FileInputStream(srcFile);
                zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
                int len = 0;
                while ((len = _in.read(_byte)) > 0) {
                    zipOut.write(_byte, 0, len);
                }
                _in.close();
                zipOut.closeEntry();
            }
        }
        return i;
    }


    /**
     * 获得文件大小
     *
     * @param zip 目标文件url
     */
    public static String getZipSize(String zip) {
        String fileSize = "";
        File f = new File(zip);
        if (f.exists() && f.isFile()) {
            fileSize = FormetFileSize(f.length());
        } else {
            System.out.println("file doesn't exist or is not a file");
        }
        return fileSize;
    }


    /**
     * 转换文件大小
     *
     * @param size 数值
     */
    public static String FormetFileSize(long size) {
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSize = "";
      /*  if (size < 1024) {
            fileSize = df.format((double) size) + "B";
        } else if (size < 1048576) {
            fileSize = df.format((double) size / 1024) + "K";
        } else if (size < 1073741824) {
            fileSize = df.format((double) size / 1048576) + "M";
        } else {
            fileSize = df.format((double) size / 1073741824) + "G";
        }*/
        fileSize = df.format((int) size) +"";
        return fileSize;
    }


    /**
     * 获得图集图片数量
     *
     * @param i        压缩方法返回值
     * @param srcFiles 图集list
     */
    public static int getAlbumNum(int i, List<File> srcFiles) {
        int k = 0;
        if (srcFiles.size() == 1) {
            k = i;
        } else {
            k = srcFiles.size();
        }
        return k;
    }


    public static String getZipFile(TgodPhotoalbumtmp album,String albumSize) {
        String file = "/home/tgod-image" + File.separator + Constant.IMAGE_SAVE_PATH + File.separator+album.getPhotographerid()+"_"+album.getModelid()+ File.separator+album.getId()+ File.separator  +Constant.RAR_SAVE_PATH + File.separator + DateUtils.format(new Date(), "yyyy-MM-dd") + "-" + album.getModelname() + "-" + album.getPhotographername() + "-" + album.getId() +"-"+albumSize+".zip";
        return file;
    }


    public static void main(String[] args) {


        String zip = "D:\\home\\tgod_img\\ziptest.zip";
        File f1 = new File("D:\\home\\tgod-img\\下载说明.jpg");
        List<File> list = new ArrayList<File>();
        list.add(f1);
        //zipFile(zip, list);
        System.out.println("total file size=" + getZipSize(zip));
    }


}