在 Zip 中写入子目录?使用 java.util.zip。 ZipEntry.putNextEntry()

Write to subdir in Zip? Using java.util.zip. ZipEntry.putNextEntry()

所以我创建了一个 zip,并通过创建一个以“\”结尾的 zip 条目在 zip 文件中创建了一个新的子文件夹。我将如何写入子文件夹?

我的问题是我在 for 循环中对我的 ZipOutputStream 进行了 putnextEntry 调用,因此在创建文件夹后,我跳转到写入不同 zip 文件的 for 循环。但它们与 zip 中的子目录处于同一级别。

我认为正在发生的事情是因为我将 putNextEntry 与第一个实际的 zip(不是目录)条目一起使用,它正在关闭子文件夹并写入 zip 的根目录。有什么想法吗?

下面的代码

private int endprocess() {
        try {
            zipFolder(ripPath, zipOutputPath, "rips");
            //zipFolder(destPDFfiles, zipOutputPath, "pdfs");
            this.returnCode = 0;
            //log.debug ( "Accumulator count: " + acount);
            log.debug("Equivest count: " + ecount);
            //log.debug ( "Assoc count: " + scount);
            processEndOfEnvelope();
        } catch (Exception reportException) {
            log.logError("Caught exception in creating.");
            reportException.printStackTrace();
            this.returnCode = 15;
        }

        return (this.returnCode);

    }
    public static void zipFolder(String srcFolder, String dest, String outputFolder){
        try{
            ZipOutputStream zos = null;
            FileOutputStream fos = null;
            fos = new FileOutputStream(dest + "\newzip.zip");
            zos = new ZipOutputStream(fos);
            addFolderToZip(srcFolder, zos, outputFolder);
            zos.flush();
            zos.close();
        }catch(IOException e){
            log.logError("**********************");
            log.logError("IO Exception occurred");
            log.logError(e.getMessage());
            e.printStackTrace();
        }
    }
    private static void addFileToZip(String srcFile, ZipOutputStream zos, String outputFolder){
        try {
            File folder = new File(srcFile);
            if (folder.isDirectory()) {
                addFolderToZip(srcFile, zos, outputFolder);
            } else {
                byte[] buffer = new byte[1024];
                int length;
                FileInputStream fis = new FileInputStream(srcFile);
                ZipEntry ze = new ZipEntry("C:\AWDAAV\zip\newzip.zip\" + outputFolder + "\" + folder.getName());
                zos.putNextEntry(ze);
                while ((length = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, length);
                }
            }
        }catch(Exception e){
            log.logError("**********************");
            log.logError("Exception occurred");
            log.logError(e.getMessage());
            e.printStackTrace();
        }
    }

    private static void addFolderToZip(String srcFolder, ZipOutputStream zos, String outputFolder){
        try{
            File folder = new File(srcFolder);
            zos.putNextEntry(new ZipEntry(outputFolder + "\"));
            for(String fileName : folder.list()){
                addFileToZip(srcFolder + "\" + fileName, zos, outputFolder);
            }
        }catch(Exception e){
            log.logError("**********************");
            log.logError("Exception occurred");
            log.logError(e.getMessage());
            e.printStackTrace();
        }
    }

ZipEntry.setLevel(文件路径[在你的例子中,\folder]);

我查看了您的代码,我认为 ZIP API 与您想象的一样有效。

只有你的路径名有一些逻辑错误。 您需要将路径名从本地名称转换为 zip 文件中的相对位置。 也许你在那个区域的某个地方感到困惑。

这是我的建议:

文件:org/example/Main.java

package org.example;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

    public static void main(String[] args) throws IOException {
        MyZip myZip = new MyZip();
        Path sourcePath = Paths.get("C:/Users/David/Desktop/a");
        Path targetPath = Paths.get("C:/Users/David/Desktop/zip/out.zip");
        Path zipPath = Paths.get("tadaa");
        myZip.zipFolder(sourcePath, targetPath.toFile(), zipPath);
    }

}

更新:main方法中变量的解释

  • sourcePath 是您要将其内容包含在 zip 存档中的目录。
  • targetPath是zip文件的输出路径。例如,新的 zip 文件将在该位置创建。
  • zipPath 是 zip 目录中的子目录,您来自 sourcePath 的内容将放在该目录中。此变量也可以设置为 null。如果是 nullsourcePath 将被放入新 zip 存档的根目录中。

文件:org/example/MyZip.java

package org.example;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class MyZip {

    public void zipFolder(Path base, File dest, Path zipFolder) throws IOException {
        try (FileOutputStream fos = new FileOutputStream(dest);
                ZipOutputStream zos = new ZipOutputStream(fos)) {
            addFolderToZip(base.getParent(), base, zos, zipFolder);
        }
    }

    private void addFolderToZip(Path base, Path currentFolder, ZipOutputStream zos, Path zipFolder) throws IOException {
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(currentFolder)) {
            for(Path path : stream) {
                Path relativePath = base != null ? base.relativize(path) : path;
                Path pathInZip = zipFolder != null ? zipFolder.resolve(relativePath) : relativePath;
                if(path.toFile().isDirectory()) {
                    zos.putNextEntry(new ZipEntry(pathInZip.toString() + "/"));
                    // recurse to sub directories
                    addFolderToZip(base, path, zos, zipFolder);
                } else {
                    addFileToZip(path, pathInZip, zos);
                }
            }
        }
    }

    private void addFileToZip(Path sourcePath, Path pathInZip, ZipOutputStream zos) throws IOException {
        byte[] buffer = new byte[1024];
        int length;
        try (FileInputStream fis = new FileInputStream(sourcePath.toFile())) {
            ZipEntry ze = new ZipEntry(pathInZip.toString());
            zos.putNextEntry(ze);
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
        }
    }

}