[]( )三、压缩多个文件

-----------------------------------------------------------------



接下来,我们看看如何将多个文件压缩为一个zip文件。我们将把_test1.txt_和_test2.txt_压缩成_multiCompressed.zip_:



public class ZipMultipleFiles {

public static void main(String[] args) throws IOException {

    List<String> srcFiles = Arrays.asList("src/main/resources/test1.txt", "src/main/resources/test2.txt");

    FileOutputStream fos = new FileOutputStream("src/main/resources/multiCompressed.zip");

    ZipOutputStream zipOut = new ZipOutputStream(fos);

    //向压缩包中添加多个文件

    for (String srcFile : srcFiles) {

        File fileToZip = new File(srcFile);

        FileInputStream fis = new FileInputStream(fileToZip);

        ZipEntry zipEntry = new ZipEntry(fileToZip.getName());

        zipOut.putNextEntry(zipEntry);



        byte[] bytes = new byte[1024];

        int length;

        while((length = fis.read(bytes)) >= 0) {

            zipOut.write(bytes, 0, length);

        }

        fis.close();

    }

    zipOut.close();

    fos.close();

}

}




[]( )四、压缩目录

---------------------------------------------------------------



下面的例子,我们将_zipTest_目录及该目录下的递归子目录文件,全都压缩到_dirCompressed.zip中_:



public class ZipDirectory {

public static void main(String[] args) throws IOException, FileNotFoundException {

    //被压缩的文件夹

    String sourceFile = "src/main/resources/zipTest"; 

    //压缩结果输出,即压缩包

    FileOutputStream fos = new FileOutputStream("src/main/resources/dirCompressed.zip");

    ZipOutputStream zipOut = new ZipOutputStream(fos);

    File fileToZip = new File(sourceFile);

    //递归压缩文件夹

    zipFile(fileToZip, fileToZip.getName(), zipOut);

    //关闭输出流

    zipOut.close();

    fos.close();

}

 



/**

 * 将fileToZip文件夹及其子目录文件递归压缩到zip文件中

 * @param fileToZip 递归当前处理对象,可能是文件夹,也可能是文件

 * @param fileName fileToZip文件或文件夹名称

 * @param zipOut 压缩文件输出流

 * @throws IOException

 */

private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {

    //不压缩隐藏文件夹

    if (fileToZip.isHidden()) {

        return;

    }

    //判断压缩对象如果是一个文件夹

    if (fileToZip.isDirectory()) {

        if (fileName.endsWith("/")) {

            //如果文件夹是以“/”结尾,将文件夹作为压缩箱放入zipOut压缩输出流

            zipOut.putNextEntry(new ZipEntry(fileName));

            zipOut.closeEntry();

        } else {

            //如果文件夹不是以“/”结尾,将文件夹结尾加上“/”之后作为压缩箱放入zipOut压缩输出流

            zipOut.putNextEntry(new ZipEntry(fileName + "/"));

            zipOut.closeEntry();

        }

        //遍历文件夹子目录,进行递归的zipFile

        File[] children = fileToZip.listFiles();

        for (File childFile : children) {

            zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);

        }

        //如果当前递归对象是文件夹,加入ZipEntry之后就返回

        return;

    }

    //如果当前的fileToZip不是一个文件夹,是一个文件,将其以字节码形式压缩到压缩包里面

    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();

}

}




*   要压缩子目录及其子目录文件,所以需要递归遍历

*   每次遍历找到的是目录时,我们都将其名称附加“/”,并将其以_ZipEntry_保存到压缩包中,从而保持压缩的目录结构。

*   每次遍历找到的是文件时,将其以字节码形式压缩到压缩包里面



[]( )五、解压缩zip压缩包

--------------------------------------------------------------------



下面为大家举例讲解解压缩zip压缩包。在此示例中,我们将_compressed.zip_解压缩到名为_unzipTest_的新文件夹中。



public class UnzipFile {

public static void main(String[] args) throws IOException {

    //被解压的压缩文件

分享

1、算法大厂——字节跳动面试题

2、2000页互联网Java面试题大全

3、高阶必备,算法学习

Exception {

    //被解压的压缩文件

分享

1、算法大厂——字节跳动面试题

[外链图片转存中…(img-hJqJOmQf-1714575788775)]

2、2000页互联网Java面试题大全

[外链图片转存中…(img-2t86i218-1714575788776)]

3、高阶必备,算法学习

[外链图片转存中…(img-FtAYGCZl-1714575788776)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐