java使用zip4j 解压与压缩zip包

1. 下载 net.lingala.zip4j jar包

 <!--zip压缩工具包-->
        <dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>2.11.1</version>
        </dependency>

2.具体使用代码

/**
     * 压缩文件
     * @param targetFile
     * @throws ZipException
     */
    public static void zipAll(File targetFile, String sourceDirectory) throws ZipException {
        // 生成的压缩文件
        ZipFile zipFile = new ZipFile(targetFile);
        ZipParameters parameters = new ZipParameters();
        // 压缩方式
        parameters.setCompressionMethod(CompressionMethod.DEFLATE);
        // 压缩级别
        parameters.setCompressionLevel(CompressionLevel.NORMAL);
        // 要打包的文件夹
        File currentFile = new File(sourceDirectory);
        File[] fs = currentFile.listFiles();
        // 遍历test文件夹下所有的文件、文件夹
        for (File f : fs) {
            if (f.isDirectory()) {
                zipFile.addFolder(f, parameters);
            } else {
                zipFile.addFile(f, parameters);
            }
        }
    }

    /**
     * 解压文件
     * @param sourceFile
     * @param targetDirectory
     */
    public static void unzipAll(File sourceFile, String targetDirectory) throws ZipException{

        // 如果targetDirectory为空 说明是子文件夹 直接使用传进来的 sourceFile
        if (StringUtils.isBlank(targetDirectory)){
            targetDirectory = sourceFile.getAbsolutePath();
        }
        ZipFile zipFile = new ZipFile(sourceFile);
        if (isZipFile(targetDirectory)){
            targetDirectory = targetDirectory.substring(0, targetDirectory.length() - 4);
        }
        File parentFile = new File(targetDirectory);
        if (parentFile.exists()){
            FileUtils.deleteAllFiles(parentFile);
            parentFile.mkdirs();
        }
        zipFile.setCharset(Charset.forName("GBK"));

        // 解压
        zipFile.extractAll(targetDirectory);
        CloseStream.closed(zipFile);

        // 遍历
        List<File> fileList = new ArrayList<>();
        // 获取父目录下所有文件
        fileList = parentFile.isDirectory()? Arrays.asList(parentFile.listFiles()):fileList;
        for (File fileItem : fileList){
            if (fileItem.isFile()&& (isZipFile(fileItem.getAbsolutePath()))){
                unzipAll(fileItem,null);
            }
        }

    }

    /**
     * 判断文件路径是否包含zip
     * @param filePath
     * @return
     */
    public static boolean isZipFile(String filePath){
        return filePath.endsWith(ZIP.toLowerCase()) || filePath.endsWith(ZIP.toUpperCase());
    }

!!!解压之后记得关闭zipFile对象!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java中的Zip文件压缩解压缩操作,可以使用Java提供的ZipInputStream和ZipOutputStream类。下面是一个简单的示例代码,展示如何高效地解压Zip文件: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipUtils { public static void unzip(String zipFilePath, String destDirectory) throws IOException { File destDir = new File(destDirectory); if (!destDir.exists()) { destDir.mkdir(); } ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { String filePath = destDirectory + File.separator + entry.getName(); if (!entry.isDirectory()) { extractFile(zipIn, filePath); } else { File dir = new File(filePath); dir.mkdir(); } zipIn.closeEntry(); entry = zipIn.getNextEntry(); } zipIn.close(); } private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); byte[] bytesIn = new byte[4096]; int read = 0; while ((read = zipIn.read(bytesIn)) != -1) { bos.write(bytesIn, 0, read); } bos.close(); } } ``` 示例代码中的`unzip`方法接收两个参数:`zipFilePath`表示要解压缩的Zip文件的路径,`destDirectory`表示解压缩后的文件存放目录。代码首先创建目标文件夹,然后打开Zip文件并逐个读取其中的ZipEntry,如果是文件就解压缩到目标文件夹,如果是目录就创建对应的目录。解压缩过程中使用了`BufferedOutputStream`来提高效率。 要实现Zip文件的压缩,可以使用Java提供的ZipEntry和ZipOutputStream类。下面是一个简单的示例代码,展示如何压缩一个文件或目录为Zip文件: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtils { public static void zip(String sourceFile, String zipFilePath) throws IOException { FileOutputStream fos = new FileOutputStream(zipFilePath); ZipOutputStream zipOut = new ZipOutputStream(fos); File fileToZip = new File(sourceFile); zipFile(fileToZip, fileToZip.getName(), zipOut); zipOut.close(); fos.close(); } private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException { if (fileToZip.isHidden()) { return; } if (fileToZip.isDirectory()) { File[] children = fileToZip.listFiles(); for (File childFile : children) { zipFile(childFile, fileName + "/" + childFile.getName(), zipOut); } return; } FileInputStream fis = new FileInputStream(fileToZip); ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); } fis.close(); } } ``` 示例代码中的`zip`方法接收两个参数:`sourceFile`表示要压缩的文件或目录的路径,`zipFilePath`表示压缩后的Zip文件路径。代码首先创建ZipOutputStream并打开输出文件,然后递归地压缩文件或目录中的所有文件,最后关闭输出流。压缩过程中使用了`FileInputStream`和`ZipEntry`来逐个读取文件并写入Zip文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值