Java - 压缩现有文件

时间:2013-01-16 02:49:21

标签: java zip append truezip

  

可能重复:
  Appending files to a zip file with Java

Hello Java Developers,

以下是该情景:

假设我有一个名为sample.txt的文本文件。我真正想要做的是将sample.txt文件放入名为*.zip的{​​{1}}文件中。

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

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文件中? 如果您的回答与TrueZIP有关,请发布SSCCE。

我做了以下几点:

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

3 个答案:

答案 0 :(得分: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) {
      }
    }
  }
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

根据the epic JDK reference,您似乎可以使用while zis.getNextEntry() != null循环遍历文件(其中zis是ZipInputStream),然后使用zis.read()读取数组,发送到ArrayList或类似的。

然后,可以将toArray()"cast" it to a byte array with this methodzos.write()用于输出ZIP文件(其中zos是ZipOutputStream),使用zos.putNextEntry()来创造新的条目。 (您需要保存ZipEntry并使用ze.getName()获取其名称,zeZipEntry。)您应该将T替换为Byte和{ {1}}(除byte循环体之外的任何地方使用byte并且可能需要修改强制转换代码以使用forByte.byteValue()(包装器类)转换为Byte(原始类型),如下所示:

byte

请注意,这是未经测试的,并且基于JDK(条目for(int i = 0; i < objects.length; i++) { convertedObjects[i] = (Byte)objects[i].byteValue(); } ZipInputStreamZipOutputStreamArrayList)以及谷歌搜索数组广告。

对不起,如果那有点密集,希望这有帮助!!