爪哇 - 荏苒现有文件[复制](Java - Zipping existing files [dup

2019-07-18 06:32发布

可能重复:
追加文件与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 。 然而,我无法理解的事情。 (请不要理解)

Answer 1:

使用内置的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) {
      }
    }
  }
}


Answer 2:

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



Answer 3:

看来,根据史诗JDK参考 ,你可以使用while zis.getNextEntry() != null通过文件(其中ZIS是ZipInputStream)循环来,然后用zis.read()读入一个数组,其被发送到一个ArrayList或相似。

然后,人们可以使用toArray() “浇铸”到一个byte数组用这种方法和zos.write()到输出ZIP文件(其中ZOS是ZipOutputStream ),采用zos.putNextEntry()使新的条目。 (您将需要保存的ZipEntry,并得到它的名字ze.getName()ze是一个ZipEntry 。)此时应更换TBytebyte (使用byte无处不在,但for循环体),并可能需要修改铸造代码使用Byte.byteValue()以从转化Byte (包装类)以byte (原语类型),如下所示:

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

请注意,这是未经测试和基于JDK(条目ZipInputStreamZipOutputStreamArrayList ,和Byte )和阵列铸造谷歌搜索。

很抱歉,如果这是一个有点迟钝,并希望这有助于!



文章来源: Java - Zipping existing files [duplicate]