在Java中实现Zip文件的压缩与解压缩

zip这里就不多说了 , 在网上找了很多代码 , 都觉得实现不够优雅 , 所以自己写了一个工具类 。

  • 解压zip文件
  • 指定的文件进行zip压缩 ,
  • 对指定的目录进行zip压缩
ZipUtilsimport 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


推荐阅读