背景:

在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStreamZipEntryZipInputStreamInflaterInputStream

压缩文件的步骤和原理:

  1. 创建一个FileOutputStream对象,用于将压缩后的数据写入到文件中。

  2. 创建一个BufferedOutputStream对象,将其包装在FileOutputStream中,以提高写入性能。

  3. 创建一个ZipOutputStream对象,将其包装在BufferedOutputStream中,用于将数据压缩为ZIP格式。

  4. 遍历要压缩的文件列表,对于每个文件执行以下操作:

    • 创建一个ZipEntry对象,表示要添加到ZIP文件中的文件或目录。
    • 使用ZipOutputStreamputNextEntry()方法将ZipEntry添加到ZIP输出流中。
    • 如果当前要添加的条目是目录,可以跳过文件内容的读取和写入步骤。
    • 如果当前要添加的条目是文件,可以执行以下操作:
      • 打开要添加的文件。
      • 创建一个缓冲区字节数组,用于读取文件内容。
      • 使用FileInputStream读取文件内容到缓冲区中。
      • 使用ZipOutputStreamwrite()方法将缓冲区中的数据写入ZIP输出流。
    • 使用ZipOutputStreamcloseEntry()方法关闭当前ZIP条目的写入。

5. 在完成所有文件的压缩后,关闭ZipOutputStream,以确保所有数据都被写入到ZIP文件中。

示例代码

import java.io.*;
import java.util.zip.*; public class FileCompressor {
public static void compressFile(String sourceFilePath, String zipFilePath) throws IOException {
// 创建源文件的File对象
File sourceFile = new File(sourceFilePath); // 创建用于写入压缩数据的输出流
try (
FileOutputStream fos = new FileOutputStream(zipFilePath); // 用于写入ZIP文件的FileOutputStream
BufferedOutputStream bos = new BufferedOutputStream(fos); // 用于提高写入效率的BufferedOutputStream
ZipOutputStream zos = new ZipOutputStream(bos) // 用于压缩数据的ZipOutputStream
) {
// 递归地压缩源文件
compressRecursive(sourceFile, sourceFile.getName(), zos);
}
} private static void compressRecursive(File file, String parentPath, ZipOutputStream zos) throws IOException {
if (file.isDirectory()) {
// 如果文件是目录,则创建相应的目录条目并关闭条目
String entryPath = parentPath + File.separator + file.getName();
ZipEntry entry = new ZipEntry(entryPath + File.separator);
zos.putNextEntry(entry);
zos.closeEntry(); // 获取目录中的子文件和子目录
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
// 递归地压缩子文件和子目录
compressRecursive(child, entryPath, zos);
}
}
} else {
// 如果文件是普通文件,则创建相应的文件条目并写入文件数据
try (
FileInputStream fis = new FileInputStream(file); // 用于读取文件数据的FileInputStream
BufferedInputStream bis = new BufferedInputStream(fis) // 用于提高读取效率的BufferedInputStream
) {
// 创建文件条目并将其加入到压缩流中
String entryPath = parentPath + File.separator + file.getName();
ZipEntry entry = new ZipEntry(entryPath);
zos.putNextEntry(entry); // 使用缓冲区读取文件数据并写入压缩流中
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
zos.write(buffer, 0, bytesRead);
} // 关闭文件条目
zos.closeEntry();
}
}
}
} 

主要涉及类及其作用:

  1. ZipOutputStream:这个类是用于创建ZIP文件并将数据压缩为ZIP格式的主要类。它实现了OutputStream接口,可以向输出流写入ZIP格式的数据。

  2. ZipEntry:这个类表示ZIP文件中的一个条目,可以是文件或目录。它包含了条目的名称、大小、压缩比等信息,并可以作为一个完整的数据单元添加到ZipOutputStream中。

  3. ZipInputStream:这个类是用于从ZIP文件中读取数据并进行解压缩的主要类。它实现了InputStream接口,可以从输入流中读取ZIP格式的数据。

  4. InflaterInputStream:这个类是ZipInputStream的子类,用于解压缩被压缩的数据。它通过使用Inflater对象将压缩数据解压缩为原始数据。

  5. FileInputStream:这个类是用于从文件中读取数据的类。它实现了InputStream接口,可以从输入流中读取文件数据。

  6. FileOutputStream:这个类是用于将数据写入文件的类。它实现了OutputStream接口,可以将数据写入输出流中。

  7. BufferedInputStreamBufferedOutputStream:这两个类是用于提高输入输出性能的类。它们分别将一个输入流和输出流包装在内部,并提供了缓冲区,可以减少对底层流的直接读写操作,从而提高读写效率。

  8. File:这个类是用于表示文件或目录的类。它提供了方法来操作文件的属性、路径、名称等信息。

Java实现压缩文件浅谈的更多相关文章

  1. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  2. java ZIP压缩文件

    问题描述:     使用java ZIP压缩文件和目录 问题解决:     (1)单个文件压缩 注:     以上是实现单个文件写入压缩包的代码,注意其中主要是在ZipOutStream流对象中创建Z ...

  3. java ZipOutputStream压缩文件,ZipInputStream解压缩

    java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...

  4. java生成压缩文件

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...

  5. java打包压缩文件

    package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...

  6. Java实现压缩文件与解压缩文件

    由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或 ...

  7. java对压缩文件进行加密,winrar和好压 直接输入解密密码来使用

    <!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j --> <dependency> <gro ...

  8. Java生成压缩文件(zip、rar 格式)

    jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...

  9. Java读取压缩文件信息

    不解压压缩文件,获取其中包含的文件,通过文件名检查是否包含非法文件.(后续再根据文件头或内容吧) zip: import java.util.zip.ZipEntry;import java.util ...

  10. java zip 压缩文件

    zip压缩:ZipOutputStream.ZipFile.ZipInputStream 三个类的作用 一段 java  zip  压缩的代码: File dir = new File("C ...

随机推荐

  1. 一文搞懂C#中类成员的可访问性

    公众号「DotNet学习交流」,分享学习DotNet的点滴. 文末有总结,想快速浏览的朋友可直接看文末. 1.成员访问修饰符 在C#中类成员访问修饰符一共有5个,分别是public.private.p ...

  2. Acwing4244牛的比赛

    Acwing4244.牛的比赛 题目部分 N 头奶牛,编号 1∼N,一起参加比赛. 奶牛的战斗力两两不同. 这些奶牛之间已经进行了 M轮两两对决. 在对决中,战斗力高的奶牛一定会战胜战斗力低的奶牛. ...

  3. BAPI_ACC_DOCUMENT_POST 解决多行一次性供应商凭证导入问题

    POST 函数将一次性供应商 的信息放在抬头入参上,业务需要多个一次性供应商一起做凭证时,就满足不了. 抬头入参会把所有行的一次性给一样的名称. 想起之前做的 IF_EX_ACC_DOCUMENT~C ...

  4. ElasticSearch索引生命周期策略配置(ES TTL)

    背景 有些索引数据作为临时数据存放,一段时间后我们希望索引可以自动过期删除,就是常说的TTL(Time To Live)机制 ElasticSearch索引数量过多会占用很多主分片和副本分片,最终导致 ...

  5. ubuntu防火墙ufw基本使用方法

    ubuntu系统基本使用方法 防火墙 # 查看服务器防火墙状态 ufw status # 将防火墙设置为可用状态 ufw enable # 将防火墙设置为关闭状态 ufw disbale # 放行端口 ...

  6. LR(0)分析法

    LR(0)是一种自底向上的语法分析方法.两个基本动作是移进和规约. 具体例子如下 已知文法G[E] (1) E→aА (2) E→bB (3) A→cА (4) A→d (5) B→cB (6) B→ ...

  7. C++ Qt开发:Charts绘图组件概述

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts ...

  8. 23年底,我出齐了Spring boot,Spring cloud和案例方面的书,正在写一本面试书(代年终总结)

    年末了,再来总结一下吧,希望本人明年的年终总结文还能在博客园发. 这次总结的主题是本人出的java书.这几年本人出了不少书,其中有python.redis和Java方面的. 姑且不说其它,java方面 ...

  9. Math数学工具类、向上取整,向下取整,四舍五入,最大值

    package com.guoba.math; public class MathTest { /* Math数学工具类,包含以下方法: .ceil() 向上取整 .floor() 向下取整 .rou ...

  10. 从零玩转Activiti7工作流-2021-09-12-16-22-07

    title: 从零玩转Activiti7工作流 date: 2021-09-12 16:22:08.51 updated: 2021-12-26 17:43:12.171 url: https://w ...