在Java中实现Zip文件的压缩与解压缩
zip这里就不多说了 , 在网上找了很多代码 , 都觉得实现不够优雅 , 所以自己写了一个工具类 。
- 解压zip文件
- 指定的文件进行zip压缩 ,
- 对指定的目录进行zip压缩
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.StandardOpenOption;import java.nio.file.attribute.BasicFileAttributes;import java.util.LinkedList;import java.util.stream.Collectors;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;public class ZipUtils { /*** 解压文件* @param file压缩文件* @param targetDir 解压文件输出的目录* @throws IOException*/ public static void unPacket(Path file, Path targetDir) throws IOException {if (!Files.exists(targetDir)) {Files.createDirectories(targetDir);}// 创建zip对象ZipFile zipFile = new ZipFile(file.toFile());try {// 读取zip流try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file))){ZipEntry zipEntry = null;// 遍历每一个zip项while ((zipEntry = zipInputStream.getNextEntry()) != null) {// 获取zip项目名称String entryName = zipEntry.getName();// 构建绝对路径Path entryFile = targetDir.resolve(entryName);if(zipEntry.isDirectory()) { // 文件夹if (!Files.isDirectory(entryFile)) {Files.createDirectories(entryFile);}} else {// 文件// 读取zip项数据流try(InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry)){try(OutputStream fileOutputStream = Files.newOutputStream(entryFile, StandardOpenOption.CREATE_NEW)){byte[] buffer = new byte[4096];int length = 0;while ((length = zipEntryInputStream.read(buffer)) != -1) {fileOutputStream.write(buffer, 0, length);}fileOutputStream.flush();}}}}}} finally {zipFile.close();} } /*** 压缩指定的文件* @param files目标文件* @param zipFile生成的压缩文件* @throws IOException*/ public static void packet(Path[] files, Path zipFile) throws IOException {OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);try {for (Path file : files) {if (Files.isDirectory(file)) {continue;}try (InputStream inputStream = Files.newInputStream(file)) {// 创建一个压缩项 , 指定名称ZipEntry zipEntry = new ZipEntry(file.getFileName().toString());// 添加到压缩流zipOutputStream.putNextEntry(zipEntry);// 写入数据int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = inputStream.read(buffer)) > 0) {zipOutputStream.write(buffer, 0, len);}zipOutputStream.flush();}}// 完成所有压缩项的添加zipOutputStream.closeEntry();} finally {zipOutputStream.close();outputStream.close();} }/*** 压缩指定的目录* @param folder* @param zipFile* @throws IOException*/ public static void packet(Path folder, Path zipFile) throws IOException {if (!Files.isDirectory(folder)) {throw new IllegalArgumentException(folder.toString() + " 不是合法的文件夹");}OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);LinkedList path = new LinkedList
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 可与ASML实现联机!国产光刻机传来喜讯,张绍忠预言或成真?
- 烟台港“管道智脑系统”上线 在国内率先实现原油储运全息智能排产
- 计算机专业大一下学期,该选择学习Java还是Python
- 想实现《曼达洛人》的数字布景吗?索尼模块化屏幕即将开售
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 快递员工也能当“教授”?上海快递工程技术高级职称评审实现突破
- 骁龙888首次实现可变分辨率渲染 创造沉浸式游戏体验
- 学习大数据是否需要学习JavaEE
- 柔宇FlexPai 2实现多次重复折叠无折痕,斩获CES 2021创新奖
- 飞步无人车:实现首个混线工况下的自动驾驶集卡编队独立整船作业