码迷,mamicode.com
首页 > 其他好文 > 详细

关于ZIP大文件压缩

时间:2014-12-08 19:08:14      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

实测:4.76 GB一个单文件压缩没有什么问题。

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

import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

public class ZipHelper {
    
    public static void main(String[] args) {
        File[] files=new File[1];
        File tmpFile=new File("F:\\ios10.8.2\\macos.dmg");
        files[0] = tmpFile;
        File zipFile=new File("F:\\ios10.8.2\\test.zip");
        ZipHelper.zipFiles(files, zipFile);
    }
    public static boolean zipFiles(File[] files, File zipFile) {
        boolean flag = false;
        if (files != null && files.length > 0) {
            ZipArchiveOutputStream zaos = null;
            try {
                zaos = new ZipArchiveOutputStream(zipFile);
                // Use Zip64 extensions for all entries where they are required
                zaos.setUseZip64(Zip64Mode.AsNeeded);

                // 将每个文件用ZipArchiveEntry封装
                // 再用ZipArchiveOutputStream写到压缩文件中
                for (File file : files) {
                    if (file != null) {
                        ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, file.getName());
                        zaos.putArchiveEntry(zipArchiveEntry);
                        InputStream is = null;
                        try {
                            is = new FileInputStream(file);
                            byte[] buffer = new byte[1024 * 5];
                            int len = -1;
                            while ((len = is.read(buffer)) != -1) {
                                // 把缓冲区的字节写入到ZipArchiveEntry
                                zaos.write(buffer, 0, len);
                            }
                            zaos.closeArchiveEntry();
                        } catch (Exception e) {
                            flag = false;
                        } finally {
                            if (is != null)
                                is.close();
                        }
                    }
                }
                zaos.finish();
                flag=true;
            } catch (Exception e) {
                flag = false;
            } finally {
                try {
                    if (zaos != null) {
                        zaos.close();
                    }
                } catch (IOException e) {
                    flag = false;
                }
            }
        }

        return flag;
    }
    
     /**
      * 解压缩ZIP文件,将ZIP文件里的内容解压到saveFileDir目录下
      * @param zipFilePath 待解压缩的ZIP文件名
      * @param saveFileDir 目标目录
      */
    public static boolean upzipFile(String zipFilePath, String saveFileDir) {
        boolean flag = false;
        File file = new File(zipFilePath);
        if (file.exists()) {
            InputStream is = null;
            ZipArchiveInputStream zais = null;
            try {
                is = new FileInputStream(file);
                zais = new ZipArchiveInputStream(is);
                ArchiveEntry archiveEntry = null;
                // 把zip包中的每个文件读取出来
                // 然后把文件写到指定的文件夹
                while ((archiveEntry = zais.getNextEntry()) != null) {
                    // 获取文件名
                    String entryFileName = archiveEntry.getName();
                    // 构造解压出来的文件存放路径
                    String entryFilePath = saveFileDir + entryFileName;
                    byte[] content = new byte[(int) archiveEntry.getSize()];
                    zais.read(content);
                    OutputStream os = null;
                    try {
                        // 把解压出来的文件写到指定路径
                        File entryFile = new File(entryFilePath);
                        os = new FileOutputStream(entryFile);
                        os.write(content);
                    } catch (IOException e) {
                        flag = false;
                    } finally {
                        if (os != null) {
                            os.flush();
                            os.close();
                        }
                    }
                }
                flag=true;
            } catch (Exception e) {
                flag = false;
            } finally {
                try {
                    if (zais != null) {
                        zais.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    flag = false;
                }
            }
        }
        return flag;
    }

}

下载commons-compress-1.9.zip

关于ZIP大文件压缩

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/skyblue/p/4151541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!