java实现两个文件一个压缩包(在Java中实现Zip文件的压缩与解压缩)

zip这里就不多说了,在网上找了很多代码,都觉得实现不够优雅,所以自己写了一个工具类,接下来我们就来聊聊关于java实现两个文件一个压缩包?以下内容大家不妨参考一二希望能帮到您!

java实现两个文件一个压缩包(在Java中实现Zip文件的压缩与解压缩)

java实现两个文件一个压缩包

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

  • 解压zip文件
  • 指定的文件进行zip压缩,
  • 对指定的目录进行zip压缩
ZipUtils

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<String> path = new LinkedList<>(); try { Files.walkFileTree(folder, new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (!dir.equals(folder)) { // 开始遍历目录 String folder = dir.getFileName().toString(); path.addLast(folder); // 写入目录 ZipEntry zipEntry = new ZipEntry(path.stream().collect(Collectors.joining("/", "", "/"))); try { zipOutputStream.putNextEntry(zipEntry); zipOutputStream.flush(); } catch (IOException e) { throw new RuntimeException(e); } } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // 开始遍历文件 try (InputStream inputStream = Files.newInputStream(file)) { // 创建一个压缩项,指定名称 String fileName = path.size() > 0 ? path.stream().collect(Collectors.joining("/", "", "")) "/" file.getFileName().toString() : file.getFileName().toString(); ZipEntry zipEntry = new ZipEntry(fileName); // 添加到压缩流 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(); } catch (IOException e) { throw new RuntimeException(e); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { // 结束遍历目录 if (!path.isEmpty()) { path.removeLast(); } return FileVisitResult.CONTINUE; } }); zipOutputStream.closeEntry(); } finally { zipOutputStream.close(); outputStream.close(); } } }


原文:https://springboot.io/t/topic/2869

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页