【问题标题】:Java - ZipEntries being removed when appending new ZipEntryJava - 附加新的 ZipEntry 时删除 ZipEntries
【发布时间】:2016-05-11 11:03:32
【问题描述】:

我正在尝试创建一种将 java.io.File 复制到 java.util.zip.ZipFile 的方法。为此,我首先打开 ZipFile 的 java.util.zip.ZipOutputStream,然后使用文件名创建一个新的 java.util.zip.ZipEntry,将新的 ZipEntry 放入 ZipOutputStream,然后写入文件的内容到 ZipOutputStream。之后,我刷新 ZipOutputStream 并关闭所有流。

由于某种原因,我无法解释此过程会从 ZipFile 中删除所有其他 ZipEntries,并且只将复制的条目保留在其中。这里是复制文件的代码(文件由java.io.InputStream参数表示)

    public static boolean compress(final InputStream pSourceStream, final ZipFile pTarget, final ZipEntry pContainer,
        final String pFileName) {
    if (pSourceStream != null && pTarget != null && pFileName != null && !pFileName.isEmpty()) {
        try {
            final ZipOutputStream output = new ZipOutputStream(new FileOutputStream(new File(pTarget.getName())));
            final ZipEntry target = (pContainer != null) ? new ZipEntry(pContainer.getName() + pFileName)
                    : new ZipEntry(pFileName);
            output.putNextEntry(target);

            final byte[] buffer = new byte[BUFFER_SIZE];
            int readBytes;

            while ((readBytes = pSourceStream.read(buffer)) != -1) {
                output.write(buffer, 0, readBytes);
            }
            pSourceStream.close();
            output.flush();
            output.close();
            return true;
        } catch (final IOException ignore) {
            // took care of target
            // ios will return false
        }

    }
    return false;
}

这是我调用此方法的代码

public static void main(final String[] args) throws ZipException, IOException {
    final Package p = FileHandler.class.getPackage();
    final InputStream classStream = FileHandler.stream(p, "FileHandler.class");

    FileHandler.compress(classStream, new ZipFile(new File("C:/Users/litts/Desktop/FileHandlerTest/TestZip.jar")),
            "FileHandler1.class");

}

所以我在这里基本上做的是将 FileHandler 的类文件复制到一个 zip 文件中。但这样做时,它的所有其他内容都会被删除。

【问题讨论】:

    标签: java zip zipfile file-copying


    【解决方案1】:

    您不是在读取 Zip 文件,而是在文件级别覆盖它。

    【讨论】:

    • 我希望它附加到当前内容,因为 putNextEntry(...) 方法的文档说,创建了一个新条目并且流集中在那个条目上。我不认为它会自动删除所有旧数据。这意味着我必须将所有已经存在的数据复制到新的输出流中,不是吗? “文件级别”是什么意思?没听说过。 idk 对档案有很多了解
    • 我正在将旧内容复制到内存中,并在我完成复制后将其与新条目一起加载。现在工作。感谢提供线索
    【解决方案2】:

    使用 NIO.2 File API 将文件复制到 zip 文件变得更加容易。

    尝试(未经测试):

    try (FileSystem zipFS =  FileSystems.newFileSystem(URI.create("jar:" + zipURI), Collections.<String, Object>emptyMap())) {  
        Path targetInZipPath = zipFS.getPath(targetInZipPathString);  
    
        Files.copy(srcPath, targetInZipPath);  
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多