我查看了JDK和Apache压缩库附带的默认Zip库,我对它们不满意有三个原因:
-
它们很臃肿,API设计不好 . 我要write 50 lines of boiler plate byte array output, zip input, file out streams and close relevant streams and catch exceptions and move byte buffers on my own?为什么我不能拥有一个看起来像这样的
Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)
和Zipper.zip(File targetDirectory, String password = null)
的简单API? -
似乎拉链解压缩破坏文件元数据和密码处理被破坏 .
-
此外,与我使用UNIX获得的命令行zip工具相比,我尝试的所有库都慢2-3倍?
对我来说(2)和(3)是次要的,但我真的想要一个带有单线界面的良好测试库 .
9 回答
使用zip4j压缩/解压缩文件夹/文件的完整实现
将jar从here和add it下载到项目构建路径 .
class
bellow可以压缩和提取任何文件或文件夹,无论是否有密码保护 -您可以查看的另一个选项是 zt-zip ,可从Maven中心获得,项目页面位于https://github.com/zeroturnaround/zt-zip
它具有标准的打包和解包功能(在流和文件系统上)许多辅助方法来测试存档中的文件或添加/删除条目 .
有了Apache Commons-IO的IOUtils,你可以这样做:
它仍然是一些样板代码,但它只有1个非外来依赖:Commons-IO
一个非常好的项目是TrueZip .
例如(来自website):
仅使用JDK提取zip文件及其所有子文件夹:
Zip文件及其所有子文件夹:
你看过http://commons.apache.org/vfs/了吗?它声称可以为您简化很多事情 . 但我从未在项目中使用过它 .
我也不了解除JDK或Apache Compression之外的Java-Native压缩库 .
我记得有一次我们从Apache Ant中删除了一些功能 - 他们有很多内置的压缩/解压缩工具 .
使用VFS的示例代码如下所示:
我知道它已经很晚了,而且有很多答案,但这个zip4j是我用过的最好的压缩库之一 . 它简单(没有锅炉代码),可以轻松处理受密码保护的文件 .
Maven的依赖是:
另一种选择是JZlib . 根据我的经验,它比zip4J更少"file-centered",所以如果您需要处理内存中的blob而不是文件,您可能需要查看它 .
这里有一个完整的示例,用于递归压缩和解压缩文件:http://developer-tips.hubpages.com/hub/Zipping-and-Unzipping-Nested-Directories-in-Java-using-Apache-Commons-Compress