Administrator
发布于 2024-11-11 / 8 阅读
0
0

ZipOutputStream

ZipOutputStream

ZipOutputStream压缩流

此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是把文件打包成压缩文件,常用于附件下载(多文件下载),文件压缩存储。

image-20241106095157320

常用API

public void putNextEntry(ZipEntry e);
开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。
这里的ZipEntry就是一个条目

public void closeEntry();
关闭当前 ZIP 条目并定位流以写入下一个条目
    
条目类:ZipEntry(表示 ZIP 文件条目)

通过例子了解ZipEntry:
如下:

new ZipEntry(name):这个name是什么,解压后的文件结构就是什么
我有一个文件是:‪D:\CaptureTest\filepath\1.jpg,
而name = "Image\01.jpg"
生成压缩文件后,再解压的文件结构就是"Image\01.jpg"

步骤如下:

1.创建ZipOutputStream对象.创建此对象时,需要传入一个OutputStream对象作为参数,此OutputStream对象通常是指向要创建的ZIP文件的FileOutputStream对象

2.创建ZipEntry对象:ZipEntry表示ZIP文件中的一个条目。创建此对象时,需要传入一个字符串作为参数,此字符串是条目的名字,可以包含路径

3.将ZipEntry对象添加到ZipOutputStream对象中:通过调用ZipOutputStream对象的putNextEntry方法,将ZipEntry对象添加到ZIP文件中。此方法将开始写入新的ZIP文件条目。

4.写入条目内容:接下来,就可以将要压缩的文件内容写入ZipOutputStream对象了。通常,这是通过读取要压缩的文件的内容,然后写入ZipOutputStream对象来完成的。

5.关闭ZipEntry对象:写入条目内容后,需要调用ZipOutputStream对象的closeEntry方法,关闭当前的ZipEntry对象,以便开始写入下一个条目。

6.关闭ZipOutputStream对象:最后,完成所有条目的写入后,需要调用ZipOutputStream对象的close方法,关闭流,以完成ZIP文件的创建。

示例

public static void main(String[] args) throws IOException {
        String baseDir = "E:\\ProfessionalDoc\\Java";
        String zipFileName = baseDir.concat("\\aaa.zip");

        File srcFileFirst = new File(baseDir.concat("\\").concat("java1018.md"));
        File srcFileSecond = new File(baseDir.concat("\\").concat("head-first-design-patterns-2nd.pdf"));

        //
        FileOutputStream fileOutputStream = null;
        ZipOutputStream zipOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(zipFileName);
            zipOutputStream = new ZipOutputStream(fileOutputStream);

            compressFile(srcFileFirst, zipOutputStream);
            compressFile(srcFileSecond, zipOutputStream);

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            zipOutputStream.flush();
            fileOutputStream.flush();
            IOUtils.closeQuietly(zipOutputStream, fileOutputStream);
        }


    }


    private static void compressFile(File srcFile, ZipOutputStream zipOutputStream) throws IOException {
        ZipEntry zipEntry = new ZipEntry(srcFile.getName());
        try (FileInputStream srcFileStream = new FileInputStream(srcFile)) {
            zipOutputStream.putNextEntry(zipEntry);
            srcFileStream.transferTo(zipOutputStream);
        } catch (FileNotFoundException e) {
            throw e;
        } finally {
            zipOutputStream.closeEntry();
        }
    }

评论