gpt4 book ai didi

java - 将文件复制到 Java 中的双存档中(一个 zip 文件位于另一个 zip 文件中)

转载 作者:行者123 更新时间:2023-12-02 09:59:56 25 4
gpt4 key购买 nike

我有一个耳朵文件,“archive.ear”。该存档包含一个 war 文件“archive.war”。在此文件中,我想用磁盘上存在的新文件替换文件“/myFile.properties”。

新文件的内容保存在 java.io.File 对象中,名为“file”。我将存档中“/myFile.properties”的输出流保存在 java.io.OutputStream 对象中。之后,我尝试使用

org.apache.commons.io.FileUtils.copy(File input, OutputStream output)

当前代码是:

// Java method from extracting the output stream
public OutputStream getOutputStream(OutputStream out, String entry) throws IOException {
ZipOutputStream zos = new ZipOutputStream(out);
ZipEntry zipEntry = new ZipEntry(entry);
while (zipEntry != null) {
if (zipEntry.toString().equals(entry)) {
return zos;
}
}
throw new IllegalStateException("No entry '" + entry + "' found");
}

// copy the file content to output stream
// extract output stream "archive.war" from "archive.ear"
OutputStream warOs = zu.getOutputStream(new FileOutputStream("archive.ear"), "archive.war");

// extract output stream "<path>/myFile.properties" from "archive.war"
OutputStream myFileOutput = zu.getOutputStream(warOs, "<path>/myFile.properties" );

FileUtils.copyFile(file, myFileOutput);

我也尝试使用,insted of copyFile():

myFileOutput.write(getBytesFromFile(file));

方法“getBytesFromFile()”从文件对象返回一个字节数组。

当我打开war存档时,我希望“myFile.properties”具有新内容,该内容位于java对象“file”中。该文件具有正确的内容。结果是 ZipException:

Exception in thread "main" java.util.zip.ZipException: no current ZIP entry
at java.util.zip.ZipOutputStream.write(Unknown Source)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2315)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2270)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2291)
at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1094)
at main.Main.main(Main.java:69)

最佳答案

您无法(轻松)使用 Java 操作现有的 zip 文件。您必须以迂回的方式完成此操作。

  1. 将当前的“archive.ear”打开为 ZipInputStream。
  2. 打开一个新的“archive.ear.new”作为 ZipOutputStream。
  3. 将所有 ZipEntries 从 1 转移到 2。
    1. 当您进入条目“archive.war”时
    2. 为其打开一个新的 ZipInputStream
    3. 为 2 的条目打开一个新的 ZipOutputStream。
    4. 传输除“myFile.properties”之外的所有 ZipEntries
    5. 传输条目的“myFile.properties”内容
    6. 刷新 ZipOutputStream,关闭条目
  4. 将新文件重命名为旧文件

关于java - 将文件复制到 Java 中的双存档中(一个 zip 文件位于另一个 zip 文件中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com