将文件复制到Java中的双重存档(另一个zip文件中的一个zip文件)中

时间:2019-04-16 12:54:21

标签: java copy archive

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

新文件的内容保存在名为“ file”的java.io.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);

我也尝试使用,安装了copyFile():

myFileOutput.write(getBytesFromFile(file));

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

当我打开战争档案时,我希望“ 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)

1 个答案:

答案 0 :(得分:1)

您不能(轻松)使用Java操作现有的zip文件。 您将必须以回旋的方式进行操作。

  1. 以ZipInputStream打开当前的“ archive.ear”。
  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. 将新文件重命名为旧文件