1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 使用Java解压zip格式压缩包

使用Java解压zip格式压缩包

时间:2022-09-12 10:32:21

相关推荐

使用Java解压zip格式压缩包

Maven引用

使用了apache的ZipArchiveEntry和FileUtils,具体的maven引用如下(版本按需指定)

<!-- /artifact/mons/commons-compress --><dependency><groupId>mons</groupId><artifactId>commons-compress</artifactId><version>1.20</version></dependency><!-- /artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency>

代码

/*** 解压压缩包** @param zipPath 压缩包路径 example:E:\file\test.zip* @param unZipPath 解压路径 example:E:\file\test\*/public static void unZip(String zipPath, String unZipPath) {// apache commons-compress 获取压缩文件流try (ZipArchiveInputStream inputStream = new ZipArchiveInputStream(new FileInputStream(zipPath))) {// 定义entry对象ZipArchiveEntry entry;// 循环压缩文件流while ((entry = inputStream.getNextZipEntry()) != null) {// 获取文件对象File file = new File(unZipPath + entry.getName());// 判断是否为文件夹if (entry.isDirectory()) {// 创建解压路径文件夹FileUtils.forceMkdir(file);continue;}// 生成对应文件FileUtils.copyToFile(inputStream, file);}} catch (IOException e) {e.printStackTrace();}}

说明

使用try-resource方式创建ZipArchiveInputStream对象,会在执行之后自动调用close()方法,ZipArchiveInputStream重写了close()方法,调用时会关闭对应的FileInputStream,所以不需要再显示关闭流。循环获取文件对象时,要注意判断当前entry是否为文件夹,代码中调用了FileUtils.forceMkdir(file)处理此情况,此方法中调用了File类下的mkdirs()方法,会自动创建不存在的父级文件夹,避免了因不同压缩工具生成压缩包导致的解压时父级文件夹不存在,需显示判断再创建的问题。循环获取文件对象时,若当前entry是文件,则调用FileUtils.copyToFile(inputStream, file)方法,将文件写入指定目录下。

此方法会自动创建文件夹,所以不需要先创建unZipPath对应文件夹。

一般来说,此方法会将整个输入流写入文件,但是当前场景下,输入流是PushbackInputStream类型(在ZipArchiveInputStream构造器中指定),重写了read()方法,每次复制的都是输入流中当前entry文件对应的位置,所以while循环中每次复制文件使用的输入流其实是同一个对象,因此copyToFile()方法不能用copyInputStreamToFile()方法代替(此方法每次执行完都会关闭输入流,导致下次循环无法获取数据)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。