`
cnetwei
  • 浏览: 177115 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用Java操作zip文件

阅读更多

使用Java操作zip文件

 

 

Java提供了操作zip文件的API,具体来说,它们位于:java.util.zip 包中,以下的两个工具类分别用于创建zip文件、展开(解压缩)zip文件。

 

创建zip文件的助手类:

/**
 * @author INC062805
 * 
 */
public class ZipHelper {
	// 静态创建起
	public static ZipHelper create(File input, File output) {
		// 检查参数
		if (input == null || !input.exists()) {
			throw new IllegalArgumentException("input is NULL or not exist!");
		}
		if (output == null) {
			throw new IllegalArgumentException("output can not be NULL!");
		}

		return new ZipHelper(input, output);
	}

	// 隐藏构建器
	ZipHelper(File input, File output) {
		this.input = input;
		this.output = output;
	}

	// 开始执行压缩
	public boolean start() {
		OutputStream out = null;
		try {
			out = new BufferedOutputStream(new FileOutputStream(output));
			ZipOutputStream zipOut = new ZipOutputStream(out);

			zipOut.setLevel(ZipEntry.STORED);
			zip(zipOut, input, input);

			zipOut.flush();
			zipOut.finish();
			zipOut.close();

			return true;
		} catch (Exception e) {
			// e.printStackTrace();
			return false;
		} finally {
			IOUtils.quietCloseOutputStream(out);
		}
	}

	// 执行压缩,input:输入文件(可以是目录),rootDir:起始目录
	private void zip(ZipOutputStream out, File input, File rootDir)
			throws IOException {
		if (input == null || !input.exists()) {
			return;
		}
		if (input.isDirectory()) {
			zipDirectory(out, input, rootDir);
		} else {
			zipFile(out, input, rootDir);
		}

	}

	// 向ZipOutputStream中添加目录,dir:输入目录,rootDir:起始目录
	private void zipDirectory(ZipOutputStream out, File dir, File rootDir)
			throws IOException {
		// 检查input目录,是否是系统顶级目标,例如:c:\ or /
		if (rootDir.getParentFile() == null) {
			// SKIP ROOT DIR
		}

		if (!onlyFile) {
			String name = getEntryNameString(dir, rootDir) + '/';
			out.putNextEntry(new ZipEntry(name));
			// System.out.println("zip.dir:" + entry.getName());
		}

		File[] files = dir.listFiles();
		for (File f : files) {
			zip(out, f, rootDir);
		}
	}

	// 向ZipOutputStream中 添加文件
	private void zipFile(ZipOutputStream out, File file, File rootDir)
			throws IOException {
		//
		ZipEntry entry = new ZipEntry(getEntryNameString(file, rootDir));
		out.putNextEntry(entry);

		InputStream in = null;
		try {
			in = new FileInputStream(file);
			IOUtils.copy(in, out);
			out.closeEntry();
			// System.out.println("zip.file:" + entry.getName());
		} finally {
			IOUtils.quietCloseInputStream(in);
		}
	}

	// 通过输入文件(名称),取得在Zip Entry中应该有的名称
	private String getEntryNameString(final File input, final File rootDir) {
		if (onlyFile) {
			return input.getName();
		}

		// 检查是否是root
		if (input.equals(rootDir)) {
			return input.getName();
		}

		// 确认回溯前的起始位置
		final File parent = rootDir.getParentFile();
		File file = input;

		// 回溯 直到找到 root
		StringBuilder ret = new StringBuilder();
		do {
			if (ret.length() > 0) {
				ret.insert(0, '/');
			}
			ret.insert(0, file.getName());
			file = file.getParentFile();

		} while (file != null && !file.equals(parent));

		return ret.toString();
	}

	// 是否更新已存在的输出文件
	// private boolean update = false;
	// 是否仅仅打包文件,忽略目录结构
	private boolean onlyFile = false;
	// 输入输出
	private final File input;
	private final File output;

	public boolean isOnlyFile() {
		return onlyFile;
	}

	public void setOnlyFile(boolean onlyFile) {
		this.onlyFile = onlyFile;
	}
}
 

展开zip文件的助手类:

/**
 * @author INC062805
 * 
 *         展开zip文件的助手类
 */
public class UnZipHelper {
	//
	public static UnZipHelper create(File srcZipFile, File destDir) {
		return new UnZipHelper(srcZipFile, destDir);
	}

	//
	private File srcZipFile, destDir;
	private CharSequence error = null;

	// 隐藏构建器
	private UnZipHelper(File srcZipFile, File destDir) {
		this.srcZipFile = srcZipFile;
		this.destDir = destDir;
	}

	// 取得错误信息
	public CharSequence getErrorInfo() {
		return error;
	}

	// 展开src 指定的zip文件到 目标位置dest
	public boolean start() {
		return start(true);
	}

	// 展开src 指定的zip文件到 目标位置dest,并自动创建顶级目录
	public boolean start(boolean autoCreateTopDir) {
		// 自动创建顶级目录 --- 与zip文件同名
		if (autoCreateTopDir) {
			String name = srcZipFile.getName();

			// 析除扩展名
			int pos = name.lastIndexOf('.');
			if (pos > 0) {
				name = name.substring(0, pos);
			}

			destDir = new File(destDir, name);
			destDir.mkdirs();
		}

		try {
			ZipFile zf = new ZipFile(srcZipFile);
			Enumeration<? extends ZipEntry> e = zf.entries();
			boolean bool = false;
			while (e.hasMoreElements()) {
				ZipEntry ze = e.nextElement();
				// 处理目录
				if (ze.isDirectory()) {
					bool = expandDirectory(ze, destDir);
					continue;
				}
				// 处理文件
				bool = expandFile(zf, ze, destDir);
			}
			return bool;
		} catch (Exception e) {
			error = "open zipfile Error:(" + e.getLocalizedMessage() + ")";
			return false;
		}
	}

	// 解压缩目录元素 到目标位置
	private boolean expandDirectory(ZipEntry ze, File destDir) {
		File dir = new File(destDir, ze.getName());
		boolean bool = dir.exists() ? true : dir.mkdirs();
		// System.out.println("Expand.Dir:" + dir.getAbsolutePath());
		if (!bool) {
			error = "create Dest Directory Error,:-(";
		}
		return bool;
	}

	// 解压缩文件元素到目标目录下
	private boolean expandFile(ZipFile zf, ZipEntry ze, File destDir) {
		// 定位到目标目录
		String name = ze.getName();
		File dir = locateDestDirectory(name, destDir);

		// 确认目标文件位置
		int pos = name.lastIndexOf('/');
		if (pos > 0) {
			name = name.substring(pos + 1);
		}

		// 从zip 输入流中创建 目标文件
		return makeFile(new File(dir, name), zf, ze);
	}

	// 定位目标实体的所在目录
	private File locateDestDirectory(String path, File destDir) {
		File dir = destDir;
		int pos = path.indexOf('/');
		while (pos > 0) {
			dir = new File(dir, path.substring(0, pos));
			path = path.substring(pos + 1);
			pos = path.indexOf('/');
		}
		return dir;
	}

	//
	private boolean makeFile(File file, ZipFile zf, ZipEntry ze) {
		OutputStream out = null;
		InputStream in = null;
		try {
			//
			boolean bool = file.exists() ? true : file.createNewFile();
			// System.out.println("create New File:" + bool);
			if (!bool) {
				error = "createNewFile.Error,:-(";
				return false;
			}

			//
			out = new BufferedOutputStream(new FileOutputStream(file));
			in = zf.getInputStream(ze);

			// long len =
			IOUtils.copy(in, out);
			// System.out.println("make New File length:" + len);
			return true;
		} catch (Exception e) {
			error = "makeFile.Error:(" + e.getLocalizedMessage() + ")";
			return false;
		} finally {
			IOUtils.quietCloseOutputStream(out);
			IOUtils.quietCloseInputStream(in);
		}
	}
}
 

参考资料:

解决Zip文件中文名问题

http://www.cnblogs.com/CUCmehp/archive/2008/10/28/1320872.html


加密,解密zip文件、对称加密,RSA,AES算法

http://hi.baidu.com/yezongbo/blog/item/1b7960fd6aae661308244d14.html


除了Java平台本身提供的API之外,我还发现一个开源的项目,Truezip (http://truezip.java.net/)有机会再研究吧。

 

附件是两个助手类文件,可下载使用(将.png后缀删除即可):

ZipHelper.javaUnZipHelper.java

  • 大小: 3.9 KB
  • 大小: 3.8 KB
分享到:
评论

相关推荐

    详解Java无需解压直接读取Zip文件和文件内容

    Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    zip4j--Java操作zip压缩文件接口

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

    基于Java向zip压缩包追加文件

    在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...

    使用java代码替换zip内的文件.docx

    这种方法减少了磁盘空间的占用,提高了处理效率,特别适用于处理大文件或需要高效操作ZIP文件的场景。在实际开发中,根据具体需求,可以进一步优化这个代码,比如添加错误处理机制,或者支持替换多个文件。

    使用java处理zip文件

    `java.util.zip`包提供了必要的类和接口,使得开发者能够方便地操作ZIP文件。本文将深入探讨如何使用Java处理ZIP文件,以及相关的知识点。 首先,`ZipFile`类是处理ZIP文件的核心。它允许我们打开一个存在的ZIP文件...

    java读取zip文件

    在Java编程环境中,读取ZIP文件是一项...通过熟练掌握`java.util.zip`包中的类,你可以轻松应对各种ZIP文件操作。在学习和参考项目示例源代码时,确保理解每一步的作用,这将有助于你在实际工作中更好地应用这些知识。

    java压缩zip文件解决中文乱码问题

    在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...

    java解压zip压缩文件

    在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...

    java操作zip_包括加解密码

    Java操作ZIP文件,特别是涉及到加解密码的环节,是一项常见的任务。在Java中,我们可以使用标准的`java.util.zip`库来处理基本的ZIP文件操作,但若涉及到加密和解密,就需要借助第三方库,例如`Zip4j`。本文将深入...

    ZIP文件解压上传服务器

    本场景涉及的是使用Java处理ZIP文件,解压后并将解压的文件上传至服务器。以下是对这一过程的详细阐述: 首先,我们需要理解`ZIP`文件格式。ZIP是一种常用的文件压缩格式,它能将多个文件或目录打包成一个单一的...

    poi.zip java读取excel文件

    Java 读取 Excel 文件是许多开发任务中的常见需求,Apache POI 是一个广泛使用的开源库,专门用于处理 Microsoft Office 格式的文件,包括 Excel。在本案例中,提供的压缩包 "poi.zip" 包含了两个子文件:poi-bin-...

    JAVA解压ZIP多层目录文件(需ant.jar

    本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip.ZipFile`类来实现解压功能。在实际应用中,这种方法非常实用...

    java 中 zip压缩文件解压工具类

    本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...

    使用 Java 实现的压缩/解压 ZIP 文件的工具类

    本文将深入探讨如何使用Java实现ZIP文件的压缩与解压,重点讲解核心API,如`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`。 首先,我们来了解一下ZIP文件格式。ZIP是一种用于存储多个文件到一个单一...

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    在Java编程语言中,文件的压缩与解压缩是常见的操作,尤其在数据传输、存储优化以及备份场景下显得尤为重要。...通过上述知识点,开发者能够有效地在Java环境中进行ZIP文件的压缩与解压缩操作,满足实际项目需求。

    java 生成zip压缩文件

    在创建ZIP文件时,我们主要会用到`ZipOutputStream`和`FileInputStream`这两个类。`ZipOutputStream`用于写入ZIP格式的数据,而`FileInputStream`则用于读取要压缩的原始文件内容。 1. **使用ZipOutputStream**: ...

    java解压zip格式文件

    要解压一个Zip文件,我们需要按照以下步骤操作: 1. **打开Zip文件**:使用`FileInputStream`打开Zip文件,然后通过`ZipInputStream`构造器创建一个新的Zip输入流实例。这样,我们就可以逐个读取Zip文件中的条目了...

    java 解压缩zip文件

    本文将深入探讨如何使用Java API来解压缩ZIP文件,包括基本概念、核心类库以及具体实现步骤。 ZIP文件是一种广泛使用的文件归档格式,它可以将多个文件和目录组合成一个单一的可压缩文件,方便存储和传输。在Java中...

    java zip文件加密

    本篇文章将深入探讨如何在Java中对Zip文件进行加密,并提供相关的代码示例和jar包使用方法。 首先,我们需要理解Java的`ZipOutputStream`类,它是用于创建Zip文件的主要工具。然而,`ZipOutputStream`默认并不支持...

Global site tag (gtag.js) - Google Analytics