如何在Java中读写zip文件?

5

我正在进行一个练习,以了解如何在Java中读写zip文件。我已经阅读了有关读取文件并将其制作为zip文件的内容,并尝试过了。我也已经阅读了有关使用Java读取zip文件的内容。如何将这些读取和写入操作组合在一起呢?比如,我想要读取硬盘上的一个zip文件,并将其保存在另一个位置。

我能够使用以下代码读取zip文件:

FileInputStream fs = new FileInputStream("C:/Documents and Settings/tamilvendhank/Desktop/abc.zip");
ZipInputStream zis = new ZipInputStream(fs);
ZipEntry zE;
while((zE=zis.getNextEntry())!=null){
    System.out.println(ze.getName());
    zis.closeEntry();
  }

zis.close();

此外,我还能使用这段代码创建一个文本文件并将其压缩:

String fn = "C:/Documents and Settings/tamilvendhank/Desktop/New Text Document.txt";
byte[] b = new byte[1024];
FileInputStream fis = new FileInputStream(fn);
fis.read(b, 0, b.length);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("C:/Documents and Settings/tamilvendhank/Desktop/123.zip"));
ZipEntry ze = new ZipEntry(fn);
ze.setSize((long)b.length);
zos.setLevel(6);
zos.putNextEntry(ze);
zos.write(b, 0, b.length);
zos.finish();
zos.close();

现在我该如何连接上述两个代码,并使代码读取一个zip文件并将其写入不同的位置。
有什么建议吗!

4
为什么你想要解压并重新压缩它呢?似乎直接复制文件更容易。 - Michael Myers
看看这个 - Eternal Noob
天啊!当我使用FileInputStream fs = new FileInputStream("C:/Documents and Settings/tamilvendhank/Desktop/abc.zip"); ZipInputStream zis = new ZipInputStream(fs);读取一个zip文件时,实际上我正在解压它!!???我的理解是正确的吗!! - user405398
@Joeri,CS:这取决于您所说的“解压缩”是什么意思。如果指的是文件系统上的原始文件,则该文件将保持不变。但是,是的,您正在读取已压缩文件的内容,因此从这个意义上说,您的代码正在内存中“解压缩”它。 - Andrzej Doyle
2个回答

5
为什么不将文件以FileInputStream的形式打开,然后将内容转储到FileOutputStream中。这就是简单的复制操作,你不需要在硬盘上解压缩文件,然后再压缩到另一个位置。

请注意,自Java7以来,您可以直接使用Files.copy。 - kritzikratzi

3
您的问题似乎更多是关于如何连接输入流和输出流,从其中一个读取并从另一个写入。
答案是使用 while 循环,从输入中读取块并将它们写入输出。类似这样的代码:
byte[] data = new byte[2048];
int b = -1;
while ((b = is.read(data)) != -1)
{
   fos.write(data, 0, b);
}

is.close();
fos.close();

1
不要忘记使用try{}finally{}块来确保关闭流。 ;) - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接