Java实现压缩文件浅谈
背景:
在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStream、ZipEntry、ZipInputStream和InflaterInputStream。
压缩文件的步骤和原理:
创建一个
FileOutputStream对象,用于将压缩后的数据写入到文件中。创建一个
BufferedOutputStream对象,将其包装在FileOutputStream中,以提高写入性能。创建一个
ZipOutputStream对象,将其包装在BufferedOutputStream中,用于将数据压缩为ZIP格式。遍历要压缩的文件列表,对于每个文件执行以下操作:
- 创建一个
ZipEntry对象,表示要添加到ZIP文件中的文件或目录。 - 使用
ZipOutputStream的putNextEntry()方法将ZipEntry添加到ZIP输出流中。 - 如果当前要添加的条目是目录,可以跳过文件内容的读取和写入步骤。
- 如果当前要添加的条目是文件,可以执行以下操作:
- 打开要添加的文件。
- 创建一个缓冲区字节数组,用于读取文件内容。
- 使用
FileInputStream读取文件内容到缓冲区中。 - 使用
ZipOutputStream的write()方法将缓冲区中的数据写入ZIP输出流。
- 使用
ZipOutputStream的closeEntry()方法关闭当前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();
}
}
}
}
主要涉及类及其作用:
ZipOutputStream:这个类是用于创建ZIP文件并将数据压缩为ZIP格式的主要类。它实现了OutputStream接口,可以向输出流写入ZIP格式的数据。ZipEntry:这个类表示ZIP文件中的一个条目,可以是文件或目录。它包含了条目的名称、大小、压缩比等信息,并可以作为一个完整的数据单元添加到ZipOutputStream中。ZipInputStream:这个类是用于从ZIP文件中读取数据并进行解压缩的主要类。它实现了InputStream接口,可以从输入流中读取ZIP格式的数据。InflaterInputStream:这个类是ZipInputStream的子类,用于解压缩被压缩的数据。它通过使用Inflater对象将压缩数据解压缩为原始数据。FileInputStream:这个类是用于从文件中读取数据的类。它实现了InputStream接口,可以从输入流中读取文件数据。FileOutputStream:这个类是用于将数据写入文件的类。它实现了OutputStream接口,可以将数据写入输出流中。BufferedInputStream和BufferedOutputStream:这两个类是用于提高输入输出性能的类。它们分别将一个输入流和输出流包装在内部,并提供了缓冲区,可以减少对底层流的直接读写操作,从而提高读写效率。File:这个类是用于表示文件或目录的类。它提供了方法来操作文件的属性、路径、名称等信息。
Java实现压缩文件浅谈的更多相关文章
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- java ZIP压缩文件
问题描述: 使用java ZIP压缩文件和目录 问题解决: (1)单个文件压缩 注: 以上是实现单个文件写入压缩包的代码,注意其中主要是在ZipOutStream流对象中创建Z ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- java生成压缩文件
在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...
- java打包压缩文件
package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...
- Java实现压缩文件与解压缩文件
由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或 ...
- java对压缩文件进行加密,winrar和好压 直接输入解密密码来使用
<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j --> <dependency> <gro ...
- Java生成压缩文件(zip、rar 格式)
jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...
- Java读取压缩文件信息
不解压压缩文件,获取其中包含的文件,通过文件名检查是否包含非法文件.(后续再根据文件头或内容吧) zip: import java.util.zip.ZipEntry;import java.util ...
- java zip 压缩文件
zip压缩:ZipOutputStream.ZipFile.ZipInputStream 三个类的作用 一段 java zip 压缩的代码: File dir = new File("C ...
随机推荐
- Ubuntu 20.04 查看内存信息
输入命令 dmidecode -t memory 输出如下: # dmidecode 3.2 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. H ...
- HarmonyOS 开发入门(二)
HarmonyOS 开发入门(二) 日常逼逼叨 在HarmonyOS 开发入门(一)中我们描述了 HarmonyOS 开发的语言ArKTs以及Ts简单的入门级语法操作,接下来我们进入第二部分Harmo ...
- 【Java】Java中StringBuilder()成员方法append()和toString()
StringBuilder就相当于C++的String长度可变,用于构造字符串对象,内部使用自动扩容的数组操作字符串数据. StringBuilder和StringBuffer使用的是相同的API[区 ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- 如何收集pod重启前现场
之前分享过几篇优化pod重启的文章,有朋友发私信问:看你的优化文章很过瘾,可否分享下如何收集pod重启前的现场. 案例分享-full gc导致k8s pod重启 记一次k8s pod频繁重启的优化之旅 ...
- 一次elasticsearch 查询瞬间超时案例分析
大家好,我是蓝胖子,有段时间没有做性能分析案例讲解了,正好前两天碰到一个性能问题,今天就来对它探讨探讨. 问题背景 在晚上9点左右,刚从外面逛街回到家,就接到了电话报警(幸好前不久刚好把电话报警机制加 ...
- 吉特日化MES系统&各类化妆品检验标准汇总
在日化行业中,生产配料过程中,对产品的检验主要分为四大类: (1) 感官指标 (2) 理化指标 (3) 微生物指标 (4) 毒理指标 根据每个产品的不同,其指标会有所不同
- 一个Servlet如何实现增-删-改-查的业务逻辑
一.业务场景 最近在教学生学习JavaWeb中的Servlet,它就是一个Java服务端的小程序,用来提供各种服务. 在讲解得时候,自己突然遇到一个问题,那就是现在没有使用什么SpringMvc框架, ...
- python tkinter使用(十一)
python tkinter使用(十一) 本篇文章主要讲下tkinter 窗口的一些属性,以及实现无法关闭的窗口中遇到的一些问题. #!/usr/bin/python3 # -*- coding: U ...
- 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题
创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1.略去static void Main(String[ ] args)主方法入口: 2.隐式使用(即隐藏且根据代码所需 ...