`
iuhiqnehc
  • 浏览: 14358 次
社区版块
存档分类
最新评论

解压缩文件

 
阅读更多
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();
		}
	}
}

分享到:
评论

相关推荐

    c#解压缩文件栗子

    例如,添加两个按钮,一个用于压缩文件,另一个用于解压缩文件,然后在按钮的Click事件处理程序中调用上述方法。 在实际开发中,可能还需要考虑错误处理,如文件不存在、权限问题等。同时,为了提高用户体验,可以...

    java自动解压缩文件

    Java自动解压缩文件是编程领域中的一个重要话题,尤其是在服务器端应用中,经常需要处理上传的压缩文件并进行解压操作。Java提供了丰富的API来支持这一功能,主要涉及到`java.util.zip`包中的类,如`ZipInputStream`...

    VC++ MFC 如何用 CZip CUnzip类压缩解压缩文件

    在VC++ MFC环境下,开发过程中我们可能会遇到需要对文件进行压缩或解压缩的需求。CZip和CUnzip是两个非常实用的类,它们分别用于文件的压缩和解压缩操作,是ZLib库的一个MFC封装,使得在MFC项目中使用起来更加方便。...

    压缩与解压缩文件 C++

    解压缩文件的过程与之类似,但会使用`inflateInit2()`和`inflate()`函数,以及`inflateEnd()`来结束解压缩过程。注意,解压缩时需要检查文件是否以正确的压缩格式开始,通常通过识别特定的文件标识符,如ZIP或GZIP的...

    c# 利用WinRAR压缩解压缩文件

    解压缩文件则需要用到`e`参数,表示提取文件。以下是一个解压缩文件的C#代码示例: ```csharp public void ExtractArchive(string archivePath, string targetExtractPath) { var process = new Process(); ...

    C# Zip解压缩文件

    3. 解压缩文件:以下是一个简单的解压缩文件的示例: ```csharp public static void UnzipFile(string zipFilePath, string destinationDirectory) { if (!File.Exists(zipFilePath)) { throw new ...

    解压缩文件软件ExtractNowv4.8.3.0免费安装版

    Extractnow是一个免费、快速和容易使用的解压缩文件软件,除了解压缩文件,另有测试压缩文件是否有 CRC 错误、查看压缩文件内的文件等功能 ExtractNow 解压缩文件的方式有点与众不同,提供以拖放文件到ExtractNow...

    网页调用rar解压缩文件例子

    在IT行业中,网页调用RAR解压缩文件是一个常见的任务,特别是在需要下载或处理压缩包内容的Web应用中。本文将详细讲解如何在ASP(Active Server Pages)环境中实现这个功能,以及涉及的相关知识点。 首先,ASP是一...

    文件解压缩,压缩源码c#,net4.0

    3. 解压缩文件:解压缩文件则需要使用ZipFile或SevenZipExtractor类。通过遍历压缩文件中的每个条目,然后读取并写入到目标位置。 ```csharp using ICSharpCode.SharpZipLib.Zip; // 解压缩ZIP文件 using ...

    使用GZip解压缩文件.rar

    下面是一个简单的C#代码示例,演示如何在VS2005中使用GZipStream解压缩文件: ```csharp using System.IO; using System.IO.Compression; public static void DecompressGZipFile(string gzipFilePath, string ...

    免费快速的解压缩文件软件,非常实用,强烈推荐(ExtractNow中文版)

    一个免费、快速和容易使用的解压缩文件软件,除了解压缩文件,另有测试压缩文件是否有 CRC 错误、查看压缩文件内的文件等功能。ExtractNow 解压缩文件的方式有点与众不同,提供以拖放文件到ExtractNow界面的方式来解...

    压缩并解压缩文件的开源代码

    总之,"压缩并解压缩文件的开源代码"涉及的不仅仅是简单的压缩和解压缩操作,还包括了软件工程的多个方面,如算法设计、编程接口、跨平台实现、性能优化以及社区协作。对于开发者来说,理解和利用这样的开源代码可以...

    qt 压缩解压缩文件和文件夹源码

    "qt 压缩解压缩文件和文件夹源码"是一个基于QT库实现的解决方案,利用了名为QuaZip的第三方库,该库为QT应用程序提供了方便的压缩和解压缩功能。QuaZip库是开源的,它支持多种压缩格式,如ZIP和7Z,而且兼容C++11...

    python代码实现pj zip解压缩文件

    python代码实现pj zip解压缩文件 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝...

    压缩/解压缩文件的程序源码

    解压缩文件的过程则是逆向操作,由TKYUnpackObj类来完成。它的核心功能包括: 1. 初始化:创建一个TKYUnpackObj实例,可能需要指定解压缩的目标目录或输出流。 2. 加载压缩包:读取压缩文件,解析其内部结构,准备...

    c# 解压缩文件或文件夹代码 可设置压缩密码

    解压缩文件 解压缩ZIP文件则可以使用`ZipFile.ExtractToDirectory()`方法。同样,如果设置了密码,我们需要先打开ZIP档案并遍历每个条目,然后使用`ExtractWithPassword()`方法: ```csharp public static void ...

    java解压缩文件

    Java解压缩文件是Java开发中常见的一项操作,特别是在处理数据传输、软件安装包或资源包时。本篇文章将深入探讨如何使用Java进行文件的解压缩,以及相关工具和源码的使用。 首先,Java标准库提供了`java.util.zip`...

    简单解压缩文件代码(c#)

    "简单解压缩文件代码(c#)"的标题表明我们将探讨如何使用C#来实现一个基础的解压缩功能。下面将详细介绍这个主题。 首先,我们需要了解.NET框架提供的System.IO.Compression命名空间,它包含了处理压缩文件的基本类...

    DotNet 实现Zip 解压缩文件(可压缩文件或文件夹)

    **解压缩文件** 1. 解压缩到指定目录: ```csharp public static void ExtractToDirectory(string zipFile, string destinationDirectory) { using (var zip = ZipFile.OpenRead(zipFile)) { foreach (var entry...

    Hjuffman编码压缩文件与解压缩文件

    5. **解压缩文件**:在解压缩时,首先恢复Huffman编码表,然后按照编码数据中的二进制序列,通过Huffman树反向查找对应的字符,重新构建原始文件内容。 6. **优化与改进**:为了提高效率,可以考虑使用位操作来处理...

Global site tag (gtag.js) - Google Analytics