Java 使用Apache commons-compress 解压zip文件

使用commons-compress 解压zip文件

依赖包

  • org.apache.commons:commons-compress:1.11
  • org.apache.commons:commons-lang3:3.4

只支持解压zip类型的压缩文件

示例代码

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ExtractZip {
    public static final int BUFFER_SIZE = 1024;

    /**
     * 解压 zip 文件
     * @param zipFile zip 压缩文件
     * @param destDir zip 压缩文件解压后保存的目录
     * @return 返回 zip 压缩文件里的文件名的 list
     * @throws Exception
     */
    public static List<String> unZip(File zipFile, String destDir) throws Exception {
        // 如果 destDir 为 null, 空字符串, 或者全是空格, 则解压到压缩文件所在目录
        if(StringUtils.isBlank(destDir)) {
            destDir = zipFile.getParent();
        }

        destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
        ZipArchiveInputStream is = null;
        List<String> fileNames = new ArrayList<String>();

        try {
            is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE));
            ZipArchiveEntry entry = null;

            while ((entry = is.getNextZipEntry()) != null) {
                fileNames.add(entry.getName());

                if (entry.isDirectory()) {
                    File directory = new File(destDir, entry.getName());
                    directory.mkdirs();
                } else {
                    OutputStream os = null;
                    try {
                        os = new BufferedOutputStream(new FileOutputStream(new File(destDir, entry.getName())), BUFFER_SIZE);
                        IOUtils.copy(is, os);
                    } finally {
                        IOUtils.closeQuietly(os);
                    }
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            IOUtils.closeQuietly(is);
        }

        return fileNames;
    }

    /**
     * 解压 zip 文件
     * @param zipfile zip 压缩文件的路径
     * @param destDir zip 压缩文件解压后保存的目录
     * @return 返回 zip 压缩文件里的文件名的 list
     * @throws Exception
     */
    public static List<String> unZip(String zipfile, String destDir) throws Exception {
        File zipFile = new File(zipfile);
        return unZip(zipFile, destDir);
    }

    public static void main(String[] args) throws Exception {
        List<String> names = unZip("/Users/Biao/Desktop/Archive.zip", "/Users/Biao/Desktop");
        System.out.println(names);
    }
}
commons-compress是一个开源的Java库,它提供了压缩和解压缩各种不同格式的文件的功能。 在使用commons-compress来实现zip文件分卷压缩时,需要使用ZipArchiveOutputStream类和SplitOutputStream类。 ZipArchiveOutputStream类是用于创建zip文件的类,SplitOutputStream类是用于将输出流分成多个部分的类。 下面是一个示例代码,实现将一个较大的zip文件分成多个大小相等的文件: ```java import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import org.apache.commons.compress.utils.SplitOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ZipSplitter { private static final int BUFFER_SIZE = 4096; private static final int SPLIT_SIZE = 1024 * 1024 * 100; // 100MB public static void main(String[] args) throws IOException { String sourceFilePath = "source.zip"; String splitFilePath = "source.zip.part"; int partCount = 0; FileInputStream inputStream = new FileInputStream(sourceFilePath); SplitOutputStream outputStream = new SplitOutputStream(new FileOutputStream(splitFilePath), SPLIT_SIZE); ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(outputStream); byte[] buffer = new byte[BUFFER_SIZE]; int read = 0; ZipArchiveEntry entry; while ((entry = zipInputStream.getNextZipEntry()) != null) { zipOutputStream.putArchiveEntry(entry); while ((read = inputStream.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, read); } zipOutputStream.closeArchiveEntry(); } zipOutputStream.finish(); zipOutputStream.close(); } } ``` 在上述代码中,我们首先定义了一个BUFFER_SIZE常量和一个SPLIT_SIZE常量。BUFFER_SIZE是用于读取文件的缓冲区大小,SPLIT_SIZE是每个分卷文件的大小。 接着,我们使用FileInputStream类打开源zip文件的输入流,使用SplitOutputStream类创建输出流,将分卷文件的输出流传入构造函数,并指定每个分卷文件的大小。 然后,我们使用ZipArchiveOutputStream类创建一个新的zip文件,将ZipArchiveEntry对象和源zip文件中的内容写入新的zip文件中。 最后,我们调用finish()方法和close()方法,将输出流关闭。 需要注意的是,我们生成的分卷文件名是source.zip.part,这是为了在解压缩时能够方便地识别文件。如果生成的分卷文件名与源文件名相同,可能会导致解压缩时出现问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值