//UnZip1和UnZip2两个程序使用了两种方式解压zip文件
// Zip程序用来将文件压缩为zip文件
// 解压缩时
// zip文件本身的文件名可以包含中文,zip文件内的文件的内容也可以包含中文
// 但在zip文件内不能有名称包含中文的文件和目录,否则解压程序会报错
// 这是Java类库的一个漏洞,对zip文件内的文件和目录的名称的解读方式有问题
// 可以通过修改ZipInputStream类解决这个问题
// 压缩时,如果被压缩文件中有名称包含中文的文件或目录
// 则在WinZip或WinRar中查看压缩后的zip文件时,对应文件或目录的名称显示为乱码
// 这是Java类库的一个漏洞,压缩文件时对文件和目录的名称的编码方式作了转换
// 可以通过修改ZipOutputStream类解决这个问题
// 上机运行这三个程序
// 根据这三个程序,编写一个满足下面要求的可以压缩和解压缩zip文件的程序
// 程序启动后
// (1)选择是压缩还是解压缩zip文件,或是退出程序
// (2)如果选择压缩
// 输入要压缩的文件或目录,可以输入多个,文件要包含扩展名
// 输入压缩文件名,不包含扩展名
// 显示压缩过程并将压缩过程记入日志文件
// 压缩完毕转向(1)
// (3)如果选择解压缩
// 输入要解压缩的文件,只能输入一个,不包含扩展名
// 输入放置解压后文件的目录
// 选择解压缩方式:UnZip1或UnZip2
// 显示解压缩过程并将解压缩过程记入日志文件
// 解压缩完毕转向(1)
// (4)如果选择退出程序,直接退出程序
// 日志文件格式要求
// (1)日志文件使用文本文件,以"log"为扩展名
// (2)日志记录内容包括
// 程序启动和退出
// 执行的操作(压缩、解压缩)和操作过程
// 错误和异常说明
// (3)程序启动和退出记录以日期时间开头
// 执行操作(压缩、解压缩)记录以日期时间开头
// (4)每条日志记录以换行为分隔符
// 每次程序运行的记录以"一个空行+一行"*"+一个空行"为分隔符
// 每次操作(压缩、解压缩)的记录以一个空行为分隔符
import java.io.*;
import java.util.zip.*;
import java.util.Enumeration;
class UnZip1 {
public void unZip(String filePath, String dirPath)
// filePath是需要解压的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
// dirPath是用来放置解压后文件的目录的路径,可以是绝对或相对路径
{
File f = new File(filePath);
File dir = new File(dirPath);
filePath = f.getAbsolutePath();
System.out.println("将" + filePath + "解压到" + dir.getAbsolutePath());
if (!f.isFile())
System.out.println(filePath + "文件不存在");
else {
String zipFileName = f.getName();
System.out.println(zipFileName + "开始解压");
if (!dir.isDirectory())
dir.mkdirs(); // 创建放置解压后文件的目录
try {
ZipInputStream in = new ZipInputStream(new FileInputStream(f));
FileOutputStream out;
byte buf[] = new byte[1024]; // 解压缓冲区
ZipEntry zipEntry; // 获取压缩文件中的文件或目录
String zipEntryName;
File file, parent;
int len;
while ((zipEntry = in.getNextEntry()) != null) {
zipEntryName = zipEntry.getName();
System.out
.println(zipFileName + "/" + zipEntryName + "被解压");
if (zipEntry.isDirectory()) // 如果读出的是目录
new File(dir, zipEntryName).mkdirs();
else {
file = new File(dir, zipEntryName);
// 如果读出的这个文件所在目录尚未创建
parent = file.getParentFile();
if (!parent.exists())
parent.mkdirs();
// 如果该文件已存在,直接覆盖
// 如果该文件不存在,自动创建
out = new FileOutputStream(file);
while ((len = in.read(buf, 0, 1024)) != -1)
out.write(buf, 0, len);
out.close();
}
}
in.close();
System.out.println(zipFileName + "解压完毕");
} catch (Exception e) {
System.out.println(e);
System.out.println(zipFileName + "解压失败");
}
}
}
public static void main(String args[]) {
new UnZip1().unZip(args[0], args[1]);
}
}
class UnZip2 {
public void unZip(String filePath, String dirPath)
// filePath是需要解压的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
// dirPath是用来放置解压后文件的目录的路径,可以是绝对或相对路径
{
File f = new File(filePath);
File dir = new File(dirPath);
filePath = f.getAbsolutePath();
System.out.println("将" + filePath + "解压到" + dir.getAbsolutePath());
if (!f.isFile())
System.out.println(filePath + "文件不存在");
else {
String zipFileName = f.getName();
System.out.println(zipFileName + "开始解压");
if (!dir.isDirectory())
dir.mkdirs(); // 创建放置解压后文件的目录
try {
ZipFile zipFile = new ZipFile(f);
Enumeration enu = zipFile.entries();
InputStream in;
FileOutputStream out;
byte buf[] = new byte[1024]; // 解压缓冲区
ZipEntry zipEntry; // 获取压缩文件中的文件或目录
String zipEntryName;
File file, parent;
int len;
while (enu.hasMoreElements()) {
zipEntry = (ZipEntry) enu.nextElement();
zipEntryName = zipEntry.getName();
System.out
.println(zipFileName + "/" + zipEntryName + "被解压");
if (zipEntry.isDirectory()) // 如果读出的是目录
new File(dir, zipEntryName).mkdirs();
else {
in = zipFile.getInputStream(zipEntry);
file = new File(dir, zipEntryName);
// 如果读出的这个文件所在目录尚未创建
parent = file.getParentFile();
if (!parent.exists())
parent.mkdirs();
// 如果该文件已存在,直接覆盖
// 如果该文件不存在,自动创建
out = new FileOutputStream(file);
while ((len = in.read(buf, 0, 1024)) != -1)
out.write(buf, 0, len);
in.close();
out.close();
}
}
zipFile.close();
System.out.println(zipFileName + "解压完毕");
} catch (Exception e) {
System.out.println(e);
System.out.println(zipFileName + "解压失败");
}
}
}
public static void main(String args[]) {
new UnZip2().unZip(args[0], args[1]);
}
}
class Zip {
public void zipFile(File f, int filesParentAbsolutePathLength,
ZipOutputStream out) throws Exception {
String filePath = f.getAbsolutePath();
System.out.println(filePath + "被压缩");
String zipEntryName = filePath.substring(filesParentAbsolutePathLength);
if (f.isDirectory()) {
ZipEntry zipEntry = new ZipEntry(zipEntryName + "/");
out.putNextEntry(zipEntry);
File temp[] = f.listFiles();
int num = temp.length;
for (int i = 0; i < num; i++)
zipFile(temp[i], filesParentAbsolutePathLength, out);
} else {
ZipEntry zipEntry = new ZipEntry(zipEntryName);
out.putNextEntry(zipEntry);
FileInputStream in = new FileInputStream(f);
byte buf[] = new byte[1024]; // 压缩缓冲区
int len;
while ((len = in.read(buf, 0, 1024)) != -1)
out.write(buf, 0, len);
in.close();
}
}
public void zip(String filePaths[], int num, String zipFilePath)
// filePaths数组存放需要压缩的文件或目录的路径,可以是绝对或相对路径,文件要包含扩展名
// zipFilePath是压缩后的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
{
File files[] = new File[num];
int i;
for (i = 0; i < num; i++) {
files[i] = new File(filePaths[i]);
filePaths[i] = files[i].getAbsolutePath();
}
File zipFile = new File(zipFilePath);
String str = "";
for (i = 0; i < num; i++) {
str += filePaths[i];
if (i < num - 1)
str += "、";
}
System.out.println("将" + str + "压缩到" + zipFile.getAbsolutePath());
File parent, temp = null;
boolean flag = true;
for (i = 0; i < num; i++) {
if (!files[i].exists()) {
System.out.println(filePaths[i] + "不存在");
flag = false;
}
if (i == 0)
temp = files[i].getAbsoluteFile().getParentFile();
else {
parent = files[i].getAbsoluteFile().getParentFile();
if (!parent.equals(temp)) {
System.out.println(filePaths[i] + "与" + filePaths[0]
+ "不在同一目录下");
flag = false;
}
}
}
if (flag) {
String zipFileName = zipFile.getName();
System.out.println("开始生成" + zipFileName);
// 如果压缩后的zip文件所在目录尚未创建
parent = zipFile.getAbsoluteFile().getParentFile();
if (!parent.exists())
parent.mkdirs();
// 对于硬盘某个分区的根目录,getAbsolutePath()方法返回值最后是"/"或"\"(如C:\)
// 对于非硬盘分区根目录的目录,getAbsolutePath()方法返回值最后是目录名,没有"/"或"\"(如C:\abc)
// 下面这段代码的作用是:
// 对于指定的绝对路径字符串,如果其最后一个字符不是"/"或"\"
// 把它变成最后一个字符是"/"或"\"的绝对路径字符串
String filesParentAbsolutePath = temp.getAbsolutePath();
int filesParentAbsolutePathLength = filesParentAbsolutePath
.length();
if (!filesParentAbsolutePath.endsWith("/")
&& !filesParentAbsolutePath.endsWith("\\"))
filesParentAbsolutePathLength++;
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFile));
for (i = 0; i < num; i++)
zipFile(files[i], filesParentAbsolutePathLength, out);
out.close();
System.out.println(zipFileName + "生成完毕");
} catch (Exception e) {
System.out.println(e);
System.out.println(zipFileName + "生成失败");
}
}
}
public static void main(String args[]) {
int num = args.length;
new Zip().zip(args, num - 1, args[num - 1]);
}
}
分享到:
相关推荐
本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...
在Android开发中,有时我们需要将应用内部的资源文件,如ZIP压缩文件,解压到外部存储(即SD卡)上,以便用户可以访问或使用这些数据。本文将详细讲解如何实现这一功能,主要涉及Android权限管理、文件操作以及ZIP...
2. `extract_zip(zip_file, dest_dir)`: 接收ZIP文件名`zip_file`和目标解压目录`dest_dir`,将ZIP文件解压到指定目录,保持原有的文件结构。 这两个函数内部可能涉及以下步骤: - 遍历文件/目录:对源目录进行...
在IT行业中,压缩和解压缩文件是常见的操作,特别是在存储和传输大量数据时。本文将深入探讨使用C++实现zip文件的压缩与解压缩技术,基于提供的文件名列表:XUnzip.cpp、XZip.cpp、XUnzip.h、XZip.h。 首先,`...
在IT领域,尤其是在软件开发中,压缩和解压缩文件是一项常见的任务。`C++`作为一门强大且广泛应用的编程语言,提供了多种库来处理这样的需求。`Zlib`库就是一个非常著名的开源库,专用于数据压缩和解压缩,广泛应用...
VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件,网上很多源码不好用,所以就自己做了一个。原始代码是VC++的用VS2019编译了一个,DLL封装了下。调用很简单 '调用方法如下: 'CreateZipFileA "C:\123", "C:\123.zip...
本文将深入探讨如何使用C语言实现ZIP压缩与解压功能。 ZIP是一种广泛使用的文件压缩格式,它能够将多个文件打包并压缩成一个单一的ZIP档案,以便于存储、传输和分享。ZIP文件格式的标准由PKWARE公司制定,并由Info-...
本文将深入探讨Zip压缩和解压的相关知识点,并提供一个参考示例。 首先,我们要理解Zip压缩的工作原理。Zip采用了多种压缩算法,如DEFLATE,这是一种基于LZ77的无损数据压缩算法,通过查找和替换重复的数据模式来...
5从压缩文件解压文件 6释放(关闭)压缩文件 源码包含了封装的功能模块类以及测试类, 全部源码都可以用VS2020编译通过,请放心使用! 友情提示,为了兼顾一些旧代码,预编译头文件用的是StdAfx.h,如果需要更换为...
Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...
### VBS 脚本实现 ZIP 文件的压缩与解压缩 在日常工作中,我们经常会遇到需要对文件进行压缩或解压缩的情况。对于批量处理任务,使用脚本语言可以大大提高效率。Visual Basic Script(VBS)作为Windows环境中的一种...
本程序能把站点中的 ZIP 压缩文件解压到指定目录。 转载请注明:本程序由 纯粹空间(http://www.softpure.com) 提供,作者:faisun(faisun@sina.com). 使用方法:把zip文件通过FTP上传到本文件相同的目录下,选择zip...
在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...
该对象是使用pb对文件进行zip压缩和解压,并且将zip压缩包以流方式读取和将zip压缩包的流写入到本地文件夹的方法的封装
解压缩文件的代码示例: ```cpp QZipReader reader("archive.zip"); for (auto entry : reader.entryList()) { QFile file(entry.fileName()); if (file.open(QFile::ReadOnly)) { // 读取文件内容 auto ...
* 使用给定密码解压指定的ZIP压缩文件到指定目录 * * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件...
Zip格式是一种高效的数据存储格式,它能够将多个文件和文件夹打包成一个单一的压缩文件,从而节省磁盘空间,便于传输和备份。本篇文章将深入探讨Zip文件的压缩原理、常用的工具以及源码实现。 ### 一、Zip文件格式 ...
zip压缩预解压多文件,提供两种方法:一,用java自带方式java.util.zip;二,应用apache的jar包,org.apache.commons.compress.archivers.zip
java 文件zip 压缩与解压 可以直接调用
可以使用`ExtractToDirectory`方法将ZIP文件解压到指定的目录: ```csharp ZipFile.ExtractToDirectory("源.zip", "目标目录"); ``` 3. **添加文件到ZIP**: `AddEntry`方法允许你将单个文件添加到已存在的ZIP...