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

java实现两个文件一个压缩包
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<String> path = new LinkedList<>();try {Files.walkFileTree(folder, new FileVisitor<Path>() {@Overridepublic 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;}@Overridepublic 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;}@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {return FileVisitResult.CONTINUE;}@Overridepublic 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
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图