package cn.com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* <p>
* Title: 解压缩文件
* </p>
* <p>
* Description: 通过apache的zip工具实现解压缩(ant.jar)
* </p>
*/
public class CompressFile {
private static final int BUFFER_SIZE = 1024;
/**
* 压缩文件或者文件目录到指定的zip或者rar包
*
* @param inputFilename
* 要压缩的文件或者文件夹,如果是文件夹的话,会将文件夹下的所有文件包含子文件夹的内容进行压缩
* @param zipFilename
* 生成的压缩文件的名称
*/
public synchronized void zip(String inputFilename, String zipFilename)
throws IOException {
File inputFile = new File(inputFilename);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFilename));
try {
zip(inputFile, out, "");
} catch (IOException e) {
throw e;
} finally {
out.close();
}
}
/**
* 压缩文件或者文件目录到指定的zip或者rar包
*
* @param inputFile
* 参数为文件类型的要压缩的文件或者文件夹
* @param out
* 输出流
* @param base
* 基文件夹
* @return void
*/
private synchronized void zip(File inputFile, ZipOutputStream out,
String base) throws IOException {
if (inputFile.isDirectory()) {
File[] inputFiles = inputFile.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (File file : inputFiles) {
zip(file, out, base + file.getName());
}
} else {
if (base.length() > 0) {
out.putNextEntry(new ZipEntry(base));
} else {
out.putNextEntry(new ZipEntry(inputFile.getName()));
}
FileInputStream in = new FileInputStream(inputFile);
try {
int length;
byte[] buffer = new byte[BUFFER_SIZE];
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
} catch (IOException e) {
throw e;
} finally {
in.close();
}
}
}
/**
* 解压zip或者rar包的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况
*
* @param zipFilename
* 要解压的zip或者rar包文件
* @param outputDirectory
* 解压后存放的目录
*/
public synchronized void unzip(String zipFilename, String outputDirectory)
throws IOException {
File outFile = new File(outputDirectory);
if (!outFile.exists()) {
outFile.mkdirs();
}
ZipFile zipFile = new ZipFile(zipFilename);
Enumeration en = zipFile.getEntries();
ZipEntry zipEntry = null;
while (en.hasMoreElements()) {
zipEntry = (ZipEntry) en.nextElement();
if (zipEntry.isDirectory()) {
// 创建目录
String dirName = zipEntry.getName();
dirName = dirName.substring(0, dirName.length() - 1);
File f = new File(outFile.getPath() + File.separator + dirName);
f.mkdirs();
} else {
// 解压文件
String strFilePath = outFile.getPath() + File.separator
+ zipEntry.getName();
File f = new File(strFilePath);
// 如果文件不存在,就创建该文件所在文件夹的目录
if (!f.exists()) {
String[] arrFolderName = zipEntry.getName().split("/");
String strRealFolder = "";
for (int i = 0; i < (arrFolderName.length - 1); i++) {
strRealFolder += arrFolderName[i] + File.separator;
}
strRealFolder = outFile.getPath() + File.separator
+ strRealFolder;
File tempDir = new File(strRealFolder);
// 此处使用mkdirs()方法,不能用mkdir()
tempDir.mkdirs();
}
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);
try {
int length;
byte[] buffer = new byte[BUFFER_SIZE];
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
} catch (IOException e) {
throw e;
} finally {
out.close();
in.close();
}
}
}
}
public static void main(String[] args) {
CompressFile bean = new CompressFile();
try {
boolean isZip = true;
if (isZip) {
bean.zip("D:\\Download", "d:/test_rar.zip");
} else {
bean.unzip("d:/test_rar.zip", "D:/Temp");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
例如,添加两个按钮,一个用于压缩文件,另一个用于解压缩文件,然后在按钮的Click事件处理程序中调用上述方法。 在实际开发中,可能还需要考虑错误处理,如文件不存在、权限问题等。同时,为了提高用户体验,可以...
Java自动解压缩文件是编程领域中的一个重要话题,尤其是在服务器端应用中,经常需要处理上传的压缩文件并进行解压操作。Java提供了丰富的API来支持这一功能,主要涉及到`java.util.zip`包中的类,如`ZipInputStream`...
在VC++ MFC环境下,开发过程中我们可能会遇到需要对文件进行压缩或解压缩的需求。CZip和CUnzip是两个非常实用的类,它们分别用于文件的压缩和解压缩操作,是ZLib库的一个MFC封装,使得在MFC项目中使用起来更加方便。...
解压缩文件的过程与之类似,但会使用`inflateInit2()`和`inflate()`函数,以及`inflateEnd()`来结束解压缩过程。注意,解压缩时需要检查文件是否以正确的压缩格式开始,通常通过识别特定的文件标识符,如ZIP或GZIP的...
解压缩文件则需要用到`e`参数,表示提取文件。以下是一个解压缩文件的C#代码示例: ```csharp public void ExtractArchive(string archivePath, string targetExtractPath) { var process = new Process(); ...
3. 解压缩文件:以下是一个简单的解压缩文件的示例: ```csharp public static void UnzipFile(string zipFilePath, string destinationDirectory) { if (!File.Exists(zipFilePath)) { throw new ...
Extractnow是一个免费、快速和容易使用的解压缩文件软件,除了解压缩文件,另有测试压缩文件是否有 CRC 错误、查看压缩文件内的文件等功能 ExtractNow 解压缩文件的方式有点与众不同,提供以拖放文件到ExtractNow...
在IT行业中,网页调用RAR解压缩文件是一个常见的任务,特别是在需要下载或处理压缩包内容的Web应用中。本文将详细讲解如何在ASP(Active Server Pages)环境中实现这个功能,以及涉及的相关知识点。 首先,ASP是一...
3. 解压缩文件:解压缩文件则需要使用ZipFile或SevenZipExtractor类。通过遍历压缩文件中的每个条目,然后读取并写入到目标位置。 ```csharp using ICSharpCode.SharpZipLib.Zip; // 解压缩ZIP文件 using ...
下面是一个简单的C#代码示例,演示如何在VS2005中使用GZipStream解压缩文件: ```csharp using System.IO; using System.IO.Compression; public static void DecompressGZipFile(string gzipFilePath, string ...
一个免费、快速和容易使用的解压缩文件软件,除了解压缩文件,另有测试压缩文件是否有 CRC 错误、查看压缩文件内的文件等功能。ExtractNow 解压缩文件的方式有点与众不同,提供以拖放文件到ExtractNow界面的方式来解...
总之,"压缩并解压缩文件的开源代码"涉及的不仅仅是简单的压缩和解压缩操作,还包括了软件工程的多个方面,如算法设计、编程接口、跨平台实现、性能优化以及社区协作。对于开发者来说,理解和利用这样的开源代码可以...
"qt 压缩解压缩文件和文件夹源码"是一个基于QT库实现的解决方案,利用了名为QuaZip的第三方库,该库为QT应用程序提供了方便的压缩和解压缩功能。QuaZip库是开源的,它支持多种压缩格式,如ZIP和7Z,而且兼容C++11...
python代码实现pj zip解压缩文件 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝...
解压缩文件的过程则是逆向操作,由TKYUnpackObj类来完成。它的核心功能包括: 1. 初始化:创建一个TKYUnpackObj实例,可能需要指定解压缩的目标目录或输出流。 2. 加载压缩包:读取压缩文件,解析其内部结构,准备...
解压缩文件 解压缩ZIP文件则可以使用`ZipFile.ExtractToDirectory()`方法。同样,如果设置了密码,我们需要先打开ZIP档案并遍历每个条目,然后使用`ExtractWithPassword()`方法: ```csharp public static void ...
Java解压缩文件是Java开发中常见的一项操作,特别是在处理数据传输、软件安装包或资源包时。本篇文章将深入探讨如何使用Java进行文件的解压缩,以及相关工具和源码的使用。 首先,Java标准库提供了`java.util.zip`...
"简单解压缩文件代码(c#)"的标题表明我们将探讨如何使用C#来实现一个基础的解压缩功能。下面将详细介绍这个主题。 首先,我们需要了解.NET框架提供的System.IO.Compression命名空间,它包含了处理压缩文件的基本类...
**解压缩文件** 1. 解压缩到指定目录: ```csharp public static void ExtractToDirectory(string zipFile, string destinationDirectory) { using (var zip = ZipFile.OpenRead(zipFile)) { foreach (var entry...
5. **解压缩文件**:在解压缩时,首先恢复Huffman编码表,然后按照编码数据中的二进制序列,通过Huffman树反向查找对应的字符,重新构建原始文件内容。 6. **优化与改进**:为了提高效率,可以考虑使用位操作来处理...