【无标题】

1、ZipOutputStream

ZipOutputStream 是 Java 中的一个类,它属于 java.util.zip 包,用于将多个文件或数据流写入到一个 ZIP 输出流中,从而创建 ZIP 文件。ZIP 文件是一种常用的压缩文件格式,可以包含多个文件和目录,并且这些文件和目录在 ZIP 文件中被压缩以节省存储空间。

1.1 主要方法

项目 Value
putNextEntry(ZipEntry e) 此方法用于开始写入新的 ZIP 文件条目,并将流定位到条目数据的开始位置。ZipEntry 对象表示 ZIP 文件中的一个条目,可以包含条目的名字、大小、时间戳等信息。
write(byte[] b, int off, int len) 此方法从字节数组 b 中的 off 位置开始,将 len 长度的字节写入当前 ZIP 条目。
closeEntry() 此方法用于关闭当前 ZIP 条目,并将流定位到下一个条目的开始位置。在写入完一个条目的数据后,应调用此方法以表示该条目已完成。
finish() 完成 ZIP 输出流的写入,但不关闭底层的 OutputStream。在调用 finish() 之后,可以继续向底层的 OutputStream 写入数据,但不能再向 ZipOutputStream 写入新的条目。
close() 关闭 ZIP 输出流,并释放与之相关联的资源。在调用 close() 之后,不能再向流中写入数据。通常,在 close() 被调用时,会自动调用 finish()。

1.2 使用步骤

要使用 ZipOutputStream 类来创建 ZIP 文件并添加条目(文件或数据),你需要遵循以下步骤:

  1. 创建一个 FileOutputStream 对象:这个对象将用于将 ZIP 数据写入到文件中。
  2. 使用 FileOutputStream 创建一个 ZipOutputStream 对象:ZipOutputStream 封装了 FileOutputStream,并提供了写入 ZIP 格式数据的方法。
  3. 为 ZIP 文件中的每个条目创建 ZipEntry 对象:每个 ZipEntry 对象代表 ZIP 文件中的一个文件或目录。
  4. 调用 putNextEntry(ZipEntry e) 方法:在写入文件内容之前,调用此方法以告诉 ZipOutputStream 你将要写入一个新的条目。
  5. 写入文件内容:使用 ZipOutputStream 的 write() 方法将文件内容写入 ZIP 文件中。
  6. 调用 closeEntry() 方法:在完成一个条目的内容写入后,调用此方法以关闭当前条目。
  7. 关闭 ZipOutputStream 和 FileOutputStream:完成所有条目的写入后,关闭这两个流以释放资源。

2、案例实现

案例简述:通过启动java代码来打开文件选择器对话框,用户选择确认需要进行压缩的文件,选择完毕后点击按钮确认,指定位置自动生成包含该文件的压缩包。

2.1 代码块

import javax.imageio.stream.FileImageInputStream;
import javax.swing.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipEntry;

public class FileZipper {

    private static final String FILEPATH  = "D:\\OA_Temp\\attachments\\rar_attachs\\";

	//生成文件名
    public static String CreateFileName(String suffix){
        String fileName;
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
        fileName = FILEPATH + sdf.format(date) +" temp."  + suffix;
        return fileName;
    }

	//压缩单文件
    public static void FileZipperByAFile(){
        String filename = GenerateCompress.GenerateFileName("","");
        JFileChooser fileChooser = new JFileChooser("D:\\OA_Temp\\attachments\\");  //设置文件选择器对话框默认的路径
        fileChooser.setMultiSelectionEnabled(false);
        int value = fileChooser.showOpenDialog(null);
        if(value != JFileChooser.APPROVE_OPTION){
            return ;
        }

        File outputZip = new File(CreateFileName("zip")); // 指定输出的ZIP文件
        File file = fileChooser.getSelectedFile();

        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outputZip))) {
            // 创建一个ZipEntry,设置压缩后文件的名称
            ZipEntry zipEntry = new ZipEntry(file.getName());
            zos.putNextEntry(zipEntry);

            // 使用FileInputStream读取源文件
            try (FileInputStream fis = new FileInputStream(file)) {
                byte[] bytes = new byte[1024];
                int length;
                // 读取源文件内容并写入到ZipOutputStream
                while ((length = fis.read(bytes)) >= 0) {
                    zos.write(bytes, 0, length);
                }
            }

            // 关闭ZipEntry
            zos.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("File compressed successfully!");
    }
    
    public static void main(String[] args) {
        FileZipperByAFile();
    }
}

2.2 运行界面

  1. 文件选择器对话框打开默认路径:
    在这里插入图片描述
  2. 执行结果
    在这里插入图片描述
  3. 生成压缩包
    在这里插入图片描述

相关推荐

  1. 标题

    2024-06-16 10:30:05       73 阅读
  2. 标题

    2024-06-16 10:30:05       69 阅读
  3. 标题

    2024-06-16 10:30:05       67 阅读
  4. 标题

    2024-06-16 10:30:05       77 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 10:30:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 10:30:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 10:30:05       87 阅读
  4. Python语言-面向对象

    2024-06-16 10:30:05       96 阅读

热门阅读

  1. Android Service学习笔记

    2024-06-16 10:30:05       26 阅读
  2. Oracle中如何定义定时器

    2024-06-16 10:30:05       31 阅读
  3. 实战tcpdump4.99.4交叉编译

    2024-06-16 10:30:05       33 阅读
  4. Python 学习 第二册 第11章 文件

    2024-06-16 10:30:05       27 阅读
  5. 高速缓冲存储器【易忘】

    2024-06-16 10:30:05       30 阅读
  6. Emacs Verilog mode 使用指南

    2024-06-16 10:30:05       35 阅读
  7. 广东工业大学上岸经验分享!

    2024-06-16 10:30:05       32 阅读
  8. Memcached介绍和详解

    2024-06-16 10:30:05       35 阅读
  9. AI大模型会让搜索引擎成为历史吗?

    2024-06-16 10:30:05       40 阅读
  10. 【C++ COM组件 运用ATL工程创建和调用COM组件】

    2024-06-16 10:30:05       31 阅读
  11. 记录.偏僻冷知识

    2024-06-16 10:30:05       34 阅读