关于ZIP大文件压缩

实测: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

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