`
chenpenghui
  • 浏览: 39172 次
  • 性别: Icon_minigender_1
  • 来自: 台州
社区版块
存档分类
最新评论

compress 解压缩

    博客分类:
  • JAVA
阅读更多

主要用到了apach commons里的compress包。下载:http://commons.apache.org/compress/download_compress.cgi

实现了打包和解压缩的功能。

1.打包功能:主要是用了递归的方法。如果打包文件的话,则给这个文件外加一个文件夹,这里用zip文件名当一个文件夹,再进行打包。和xp打包文件然后解压的效果差不多。文章用了IOUtils.copy其实就流的读写,只不过这样代码稍微简单的。

2.解压:最主要的是要判断压缩包里的东西是文件,还是文件夹,分开来处理就可以了。这个只能解一层,如果有需要可以递归下去继续解压缩。代码如下,请指点。package zip;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

public class CompressUtils {
	private OutputStream out = null;
	private BufferedOutputStream bos = null;
	private ZipArchiveOutputStream zaos = null;


	public static void main(String[] args) throws FileNotFoundException, Exception {
		CompressUtils compressUtils = new CompressUtils();
		compressUtils.zip("c:/abc.zip", "d:/7767test.xls", "");
//		compressUtils.unzip("c:/abc.zip", "d:/a/g/");
	}

	public void close() throws Exception {
		zaos.flush();
		zaos.close();
		bos.flush();
		bos.close();
		out.flush();
		out.close();
	}
	/**
	 * 
	 * @param zipPath
	 *            得到的zip文件的名称(含路径)
	 * @param filePath
	 *            需要压缩的文件所在的目录
	 * @param pathName
	 *            压缩到pathName文件夹下
	 * @throws Exception
	 */
	public void zip(String zipPath, String filePath, String pathName) throws Exception {
		File f = new File(zipPath);
		out = new FileOutputStream(f);
		bos = new BufferedOutputStream(out);
		zaos = new ZipArchiveOutputStream(bos);
		zaos.setEncoding("GBK");
		if (!"".equals(pathName) && null != pathName) {
			pathName = pathName + File.separator;
		} else {
			pathName = f.getName().substring(0, f.getName().length() - 4) + File.separator;
		}
		zip(zaos, filePath, pathName);
		close();
	}
	/**
	 * 
	 * @param zaos
	 *            流
	 * @param filePath
	 *            需要打包的目录
	 * @param pathName
	 *            打包到pathName的目录下
	 * @throws FileNotFoundException
	 * @throws IOException
	 */

	public void zip(ZipArchiveOutputStream zaos, String filePath, String pathName) throws FileNotFoundException, IOException {

		File file2zip = new File(filePath);
		if (file2zip.isFile()) {
			zaos.putArchiveEntry(new ZipArchiveEntry(pathName + file2zip.getName()));
			IOUtils.copy(new FileInputStream(file2zip.getAbsolutePath()), zaos);
			zaos.closeArchiveEntry();
		} else {
			File[] files = file2zip.listFiles();
			if (files == null || files.length < 1) {
				return;
			}
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					zip(zaos, files[i].getAbsolutePath(), pathName + files[i].getName() + File.separator);
				} else {
					zaos.putArchiveEntry(new ZipArchiveEntry(pathName + files[i].getName()));
					IOUtils.copy(new FileInputStream(files[i].getAbsolutePath()), zaos);
					zaos.closeArchiveEntry();
				}
			}
		}
	}
	/**
	 * 
	 * @param zipFileName
	 *            压缩文件名
	 * @param zip2FileName
	 *            解压路径
	 * @throws IOException
	 */
	public void unzip(String zipFileName, String zip2FileName) throws IOException {

		File zipfile = new File(zipFileName);
		try {
			zip2FileName = zip2FileName + File.separator;
			FileUtils.forceMkdir(new File(zip2FileName));
			ZipFile zf = new ZipFile(zipfile, "GBK");
			Enumeration zipArchiveEntrys = zf.getEntries();
			while (zipArchiveEntrys.hasMoreElements()) {
				ZipArchiveEntry zipArchiveEntry = (ZipArchiveEntry) zipArchiveEntrys.nextElement();
				if (zipArchiveEntry.isDirectory()) {
					FileUtils.forceMkdir(new File(zip2FileName + zipArchiveEntry.getName() + File.separator));
				} else {
					IOUtils.copy(zf.getInputStream(zipArchiveEntry), FileUtils.openOutputStream(new File(zip2FileName + zipArchiveEntry.getName())));
				}
			}
		} catch (Exception e) {
			throw new IOException("找不到文件:" + zipFileName);
		}
	}

}
 
分享到:
评论

相关推荐

    C++ 压缩解压缩库

    在给定的标题“C++ 压缩解压缩库”中,我们可以推断这是一个针对C++语言的库,专注于文件或数据的压缩与解压缩功能。描述提到这是为VS2012版本编译的,意味着它可能使用了Visual Studio 2012的编译环境,并且库已经...

    Huffman Compress 霍夫曼编码 压缩 解压缩 QT

    在本项目中,"Huffman Compress 霍夫曼编码 压缩 解压缩 QT"是利用Qt库来实现霍夫曼编码的压缩和解压缩功能。 具体来说,这个程序可能包含以下组成部分: 1. **数据预处理**:首先,程序需要读取输入文件并统计每...

    文件压缩解压缩

    在IT行业中,文件压缩与解压缩是日常工作中常见的操作,特别是在数据传输、存储优化和软件分发等领域。这里我们主要探讨的是一个简单的工具类,它支持zip、rar、tar等多种格式的压缩和解压缩功能,并且经过实际测试...

    common compress压缩源码

    二、压缩与解压缩API Common Compress的核心接口是`Compressor`和`Decompressor`,它们分别用于压缩和解压缩。通过这两个接口,开发者可以轻松地处理各种压缩格式。例如,使用`BZip2Compressor`进行BZip2压缩,或者...

    java源码:文件压缩解压缩包 Commons Compress.rar

    5. 解压缩:类似地,创建对应的 `ArchiveInputStream` 或 `CompressorInputStream`,然后使用 `getNextEntry` 循环读取归档中的条目,并通过 `read` 方法获取数据。 6. 处理数据:根据需求读取并处理解压缩的数据,...

    java ZIP 解压缩

    java语言操作解压缩文件。 /** * 数据压缩 * * @param data * @return * @throws Exception */ public static byte[] compress(byte[] data) throws Exception { ByteArrayInputStream bais = new ...

    C++ zip解压缩压缩

    例如,可能有一个`compress_file()`函数用于压缩单个文件,以及一个`unzip_archive()`函数用于解压缩整个ZIP文件到指定的目录。这些函数的实现可能会利用像zlib这样的底层压缩库,zlib是一个广泛使用的开源库,提供...

    解压缩.tar.Z包,先解压缩.Z,再解压缩.tar

    使用commons-compress-1.7解压缩.tar.Z文件包

    zip压缩解压缩

    【标题】:“zip压缩解压缩”这一主题主要涵盖了在计算机编程中如何使用C++语言进行ZIP文件的压缩和解压缩操作。ZIP是一种广泛使用的文件格式,它允许将多个文件打包成一个单一的压缩文件,以节省存储空间和提高传输...

    unix压缩解压缩命令详解

    Unix 压缩解压缩命令详解 Unix 操作系统中有多种压缩和解压缩命令,了解这些命令非常重要。本文将详细介绍 Unix 中常用的压缩格式和相应的压缩、解压缩命令。 tar 命令 tar 命令是 Unix 中最常用的打包命令,它...

    java android zip解压缩(解决压缩中文乱码问题)

    然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...

    zlib库解压缩

    ### zlib库解压缩知识点详解 #### 一、zlib库简介 zlib 是一个广泛使用的开源数据压缩库,由 Jean-loup Gailly 和 Mark Adler 开发并维护。该库支持无损数据压缩,主要使用 DEFLATE 压缩算法(结合了 LZ77 损失less...

    linux下的压缩与解压缩

    ### Linux下的压缩与解压缩详解 #### 一、概述 在Linux系统中,压缩与解压缩功能对于数据管理和传输非常重要。对于初学者来说,掌握基本的压缩与解压缩技巧可以帮助他们更高效地管理文件和目录。本文将详细介绍...

    基于C#的压缩与解压缩 源码

    本示例主要探讨的是如何使用C#编程语言实现文件和目录的压缩与解压缩功能。C#,作为微软开发的一种面向对象的编程语言,提供了丰富的库和API来处理这种任务。 首先,我们要知道压缩的主要目的是减小文件或数据的...

    lz4,lz4压缩,lz4解压缩

    标题中的"lz4,lz4压缩,lz4解压缩"指的是LZ4算法及其相关的压缩和解压缩过程。LZ4压缩算法基于字典匹配,通过查找输入数据中的重复模式并创建指向这些模式的指针来实现压缩。这种方法使得LZ4在处理大量数据时能够...

    文件解压缩实现

    在IT领域,文件解压缩是日常工作中常见的操作。本文将深入探讨如何实现文件的解压缩功能,特别是针对zip文件格式的处理。我们将基于Java编程语言,以`MyZip.java`这个文件作为示例,来详细讲解相关的编程知识。 ...

    Linux下常用压缩_解压缩软件简介.pdf

    Linux 下常用压缩_解压缩软件简介 Linux 操作系统中有多种常用的压缩和解压缩软件,每种软件都有其特点和使用方法。本文将对 Linux 下常用的压缩和解压缩软件进行简介,包括 compress、gzip、bzip2、tar 等。 1. ...

    JAVA文件压缩与解压缩实践(源代码+论文)

    在Java编程语言中,文件的压缩与解压缩是常见的任务,尤其在数据传输、存储优化以及备份场景下显得尤为重要。本资源"JAVA文件压缩与解压缩实践(源代码+论文)"提供了一个完整的实践教程,包括源代码和相关论文,帮助...

    c#解压缩文件栗子

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

    commons-compress-1.18.jar【说明:Java、压缩库、压缩算法、解压缩、数据存储、压缩格式】

    commons-compress-1.18.jar是一个Java压缩库,专注于数据的压缩和解压缩功能,支持多种常见的压缩格式。它提供了广泛的压缩算法和工具,用于数据存储、传输和优化存储空间。 【使用人群】 适用于Java开发者、数据...

Global site tag (gtag.js) - Google Analytics