- 浏览: 177115 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
zhongyue1q:
您好,我想继续开发DBExplorer系统,您说说一下您的QQ ...
推荐一款使用Extjs做GUI的数据库浏览工具--DBExplorer -
huangyabin001:
你好现在遇到一个问题,我现在的工作是修改系统bug,现在有个b ...
Android2.1消息应用(Messaging)源码学习笔记之二 -
sunjunliangsunjun:
Android2.1消息应用(Messaging)源码学习笔记之二 -
java-admin:
1:bitbucket
免费支持private repo,最多 ...
Code host选择 -
jialeadmin:
期待下文字数补足
[翻译]Groovy入门指南——01初学者教程
使用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); } } }
参考资料:
http://www.cnblogs.com/CUCmehp/archive/2008/10/28/1320872.html
http://hi.baidu.com/yezongbo/blog/item/1b7960fd6aae661308244d14.html
除了Java平台本身提供的API之外,我还发现一个开源的项目,Truezip (http://truezip.java.net/)有机会再研究吧。
附件是两个助手类文件,可下载使用(将.png后缀删除即可):
ZipHelper.java 、UnZipHelper.java
发表评论
-
Quartz学习笔记
2011-11-15 16:02 0Quartz学习笔记 Quartz是Java平台上,优 ... -
从Eclipse向IDEA10迁移简记
2011-10-16 21:29 0从Eclipse向IDEA10迁移简记 ... -
读书笔记——《Head_First_设计模式》
2011-04-28 16:34 0读书笔记——《Head_First ... -
Java断言——assert
2011-04-26 15:58 3503Java断言——assert Java从1.4 ... -
Java中的Classloader
2011-08-21 18:57 1065Java中的Classloader简介 Java程序并 ... -
Java内存及GC的基础知识备忘
2009-04-01 11:20 14091、堆与栈 在Java中除 ... -
commons-loggin 与 slf4j的桥接器
2008-11-12 15:32 1813选择使用SLF4j + Logback后,像Spring等还未 ... -
请帮我找到这个丢失的字符,又是字符集的问题~?
2007-12-01 11:48 1031我上一个帖子 询问 在dom4j解析xml时无法正确识别字符 ... -
dom4j解析xml文档时的字符引用(数字实体)问题及初步分析。
2007-11-30 14:45 2284xml中的字符引用 也叫 ... -
请教 XML解析时实体引用的问题
2007-11-28 15:11 2336请教 XML解析时实体引用的问题 我的XML文件有如下的内容片 ... -
CXF在Spring2.5中出现错误,及解决方法。
2007-11-24 14:36 1461当在Spring2.5中启用基于标注配置Bean时(即开启以下 ... -
CXF (不依赖Spring)怎么在tomcat下部署Service??
2007-11-24 14:28 3062CXF说实现了JAX-WS2.0规范,那么在不借助于Sprin ... -
实录Seam示例程序Booking学习过程02
2007-09-28 10:58 2143实录Seam示例程序Booking学习过程02 上 ... -
实录Seam示例程序Booking学习过程
2007-09-26 15:57 3547实录Seam示例Booking学习 ... -
在Tomcat中使用EmbeddedJBoss
2007-09-24 11:35 3123新发布的Seam2.0 使用了 ...
相关推荐
Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...
Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...
Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...
在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...
这种方法减少了磁盘空间的占用,提高了处理效率,特别适用于处理大文件或需要高效操作ZIP文件的场景。在实际开发中,根据具体需求,可以进一步优化这个代码,比如添加错误处理机制,或者支持替换多个文件。
`java.util.zip`包提供了必要的类和接口,使得开发者能够方便地操作ZIP文件。本文将深入探讨如何使用Java处理ZIP文件,以及相关的知识点。 首先,`ZipFile`类是处理ZIP文件的核心。它允许我们打开一个存在的ZIP文件...
在Java编程环境中,读取ZIP文件是一项...通过熟练掌握`java.util.zip`包中的类,你可以轻松应对各种ZIP文件操作。在学习和参考项目示例源代码时,确保理解每一步的作用,这将有助于你在实际工作中更好地应用这些知识。
在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...
在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...
Java操作ZIP文件,特别是涉及到加解密码的环节,是一项常见的任务。在Java中,我们可以使用标准的`java.util.zip`库来处理基本的ZIP文件操作,但若涉及到加密和解密,就需要借助第三方库,例如`Zip4j`。本文将深入...
本场景涉及的是使用Java处理ZIP文件,解压后并将解压的文件上传至服务器。以下是对这一过程的详细阐述: 首先,我们需要理解`ZIP`文件格式。ZIP是一种常用的文件压缩格式,它能将多个文件或目录打包成一个单一的...
Java 读取 Excel 文件是许多开发任务中的常见需求,Apache POI 是一个广泛使用的开源库,专门用于处理 Microsoft Office 格式的文件,包括 Excel。在本案例中,提供的压缩包 "poi.zip" 包含了两个子文件:poi-bin-...
本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip.ZipFile`类来实现解压功能。在实际应用中,这种方法非常实用...
本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...
本文将深入探讨如何使用Java实现ZIP文件的压缩与解压,重点讲解核心API,如`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`。 首先,我们来了解一下ZIP文件格式。ZIP是一种用于存储多个文件到一个单一...
在Java编程语言中,文件的压缩与解压缩是常见的操作,尤其在数据传输、存储优化以及备份场景下显得尤为重要。...通过上述知识点,开发者能够有效地在Java环境中进行ZIP文件的压缩与解压缩操作,满足实际项目需求。
在创建ZIP文件时,我们主要会用到`ZipOutputStream`和`FileInputStream`这两个类。`ZipOutputStream`用于写入ZIP格式的数据,而`FileInputStream`则用于读取要压缩的原始文件内容。 1. **使用ZipOutputStream**: ...
要解压一个Zip文件,我们需要按照以下步骤操作: 1. **打开Zip文件**:使用`FileInputStream`打开Zip文件,然后通过`ZipInputStream`构造器创建一个新的Zip输入流实例。这样,我们就可以逐个读取Zip文件中的条目了...
本文将深入探讨如何使用Java API来解压缩ZIP文件,包括基本概念、核心类库以及具体实现步骤。 ZIP文件是一种广泛使用的文件归档格式,它可以将多个文件和目录组合成一个单一的可压缩文件,方便存储和传输。在Java中...
本篇文章将深入探讨如何在Java中对Zip文件进行加密,并提供相关的代码示例和jar包使用方法。 首先,我们需要理解Java的`ZipOutputStream`类,它是用于创建Zip文件的主要工具。然而,`ZipOutputStream`默认并不支持...