4

可能重复:
使用 Java 将文件附加到 zip 文件

您好 Java 开发人员,

这是场景:

假设我有一个名为sample.txt. 我真正想做的是将sample.txt文件放入*.zip名为TextFiles.zip.

这是我到目前为止所学到的。

try{
    File f = new File(compProperty.getZIP_OUTPUT_PATH());
    zipOut = new ZipOutputStream(new FileOutputStream(f));
    ZipEntry zipEntry = new ZipEntry("sample.txt");
    zipOut.putNextEntry(zipEntry);
    zipOut.closeEntry();
    zipOut.close();
    System.out.println("Done");

} catch ( Exception e ){
    // My catch block
}

到目前为止,我的代码创建了一个*.zip文件并插入了该sample.txt文件。
我的问题是如何将现有文件插入到创建的*.zip文件中?
如果您的回答与TrueZIP有任何关系,请发布 SSCCE。

我做了以下事情:

  • 谷歌搜索
  • 搜索现有问题。(发现很少。没有答案。有些人没有回答我的特定问题。
  • 阅读TrueZip。然而,我无法理解一件事。(请理解)
4

3 回答 3

8

使用内置的 Java API。这会将文件添加到 Zip 文件中,这将替换可能存在的任何现有 Zip 文件,从而创建一个新的 Zip 文件。

public class TestZip02 {

  public static void main(String[] args) {
    try {
      zip(new File("TextFiles.zip"), new File("sample.txt"));
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public static void zip(File zip, File file) throws IOException {
    ZipOutputStream zos = null;
    try {
      String name = file.getName();
      zos = new ZipOutputStream(new FileOutputStream(zip));

      ZipEntry entry = new ZipEntry(name);
      zos.putNextEntry(entry);

      FileInputStream fis = null;
      try {
        fis = new FileInputStream(file);
        byte[] byteBuffer = new byte[1024];
        int bytesRead = -1;
        while ((bytesRead = fis.read(byteBuffer)) != -1) {
          zos.write(byteBuffer, 0, bytesRead);
        }
        zos.flush();
      } finally {
        try {
          fis.close();
        } catch (Exception e) {
        }
      }
      zos.closeEntry();

      zos.flush();
    } finally {
      try {
        zos.close();
      } catch (Exception e) {
      }
    }
  }
}
于 2013-01-16T03:17:29.160 回答
3

在这里你可以得到你的问题的答案: http: //truezip.schlichtherle.de/2011/07/26/appending-to-zip-files/

于 2013-01-16T03:10:52.423 回答
1

看来,根据史诗 JDK 参考,您可以使用while zis.getNextEntry() != null循环遍历文件(其中 zis 是 ZipInputStream),然后用于zis.read()读取数组,该数组被发送到 ArrayList 或类似的。

然后,可以使用toArray(),使用此方法将其“转换”到一个byte数组中,并将zos.write()其放入输出 ZIP 文件(其中 zos 是 a ZipOutputStream),zos.putNextEntry()用于创建新条目。(您将需要保存 ZipEntry 并使用ze.getName(),ze作为 a来获取其名称ZipEntry。)您应该替换TByteand bytebyte在除循环体之外的任何地方使用for),并且可能需要修改转换代码以用于Byte.byteValue()Byte(包装器类)转换为byte(原始类型),如下所示:

for(int i = 0; i < objects.length; i++) {
    convertedObjects[i] = (Byte)objects[i].byteValue();
}

请注意,这是未经测试的,并且基于 JDK(条目ZipInputStreamZipOutputStreamArrayListByte)和关于数组转换的 Google 搜索。

抱歉,如果这有点密集,希望这会有所帮助!

于 2013-01-16T03:04:13.173 回答