3

我有一个 InputStream 对象,它实际上是一个 zip 文件。我想把它改回 zip 文件并保存。我正在使用 DWR 的 FileTransfer 类对象从客户端接收上传的数据。

FileTransfer有 3 个方法,getInputStream()就是其中之一。它从 FileTransfer 对象返回 InputStream。

在我的例子中,fileTransfer 对象包含 zip 文件以及 InputStream 对象。我已经完成了,在谷歌中进行了很多搜索。但我找不到一个例子来说明 InputStream 到 zip 的转换。

更新

String zipName = file.getName();
String zipType = file.getMimeType();
InputStream zipStream = file.getInputStream();
ZipInputStream zis = new ZipInputStream(zipStream);
System.out.println("File Name: "+zipName+"\n"+"File Type: "+zipType);
int c;
File f2 = new File(DATA_STORE_LOC+dat+".zip");
path.setPath2(DATA_STORE_LOC+dat+".zip");
FileOutputStream fos = new FileOutputStream(f2);
ZipOutputStream zos = new ZipOutputStream(fos);
c = zis.read();
System.out.println(c);
while ((c = zis.read(BUFFER)) != -1) {
zos.write(BUFFER, 0, c);
}
zos.close();
zis.close();

我尝试了这段代码,想到了一个典型的文件复制程序。我知道这是假的,刚试过。它给了我java.util.zip.ZipException: ZIP file must have at least one entry

任何建议都会非常感激!!!!!!!

4

2 回答 2

4

请参阅示例 java2s、输入输出。如果您有更多问题,请随时问他们:)

为清楚起见,在此输入示例中,您应该执行以下操作:

// FileInputStream fin = new FileInputStream(args[i]);
ZipInputStream zin = new ZipInputStream(ft.getInputStream());

正如 Don Roby 正确所说,如果您只是想复制,您不需要知道文件结构,您可以使用静态 IOUtils.copy(in, out)来复制文件。

此外,如果您确实希望提取 ZIP 文件内容,则不应直接复制字节。ZIP 文件有一个结构,您可以从 ZIP 文件中提取条目,而不仅仅是字节(参见示例)。每个条目都是具有原始名称的(压缩)文件(或其数据):

ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
  System.out.println("Unzipping " + ze.getName());
  FileOutputStream fout = new FileOutputStream(ze.getName());
  for (int c = zin.read(); c != -1; c = zin.read()) {
  ...

请注意getNextEntry() 的 javadoc

读取下一个 ZIP 文件条目并将流定位在条目数据的开头。

这种定位对于获取压缩文件内容至关重要,而不是元数据。

而且我确实相信您不小心删除了第一个 int:

c = zis.read(); // removing the first
while ((c = zis.read(BUFFER)) != -1) { // so you start with the second?

我相信你混合了两个成语:

c = zis.read();
while(c != -1) {
   ...
   c = zis.read();
}

和:

int c;
while ((c = zis.read(BUFFER)) != -1) { // so you start with the second?
  ...
}

我想你可以看到区别:)

于 2010-11-11T22:04:03.557 回答
4

如果您的输入是InputStream来自 zip 文件的 an 并且您想要的输出仍然是具有相同内容的 zip 文件,那么您只是在执行文件复制操作,根本不必担心 zip。您只需要在执行操作时或多或少地读取InputStream并写入 a ,但不必担心将任一流包装在可识别 zip 的流中。FileOutputStream

ZipInputStream如果您必须将 zip 文件的内容提取为单独的文件(即以编程方式解压缩),这很有用。另一方面,ZipOutputStream如果您有内容并且需要将它们组合成一个 zip 文件,则使用它。

于 2010-11-12T00:37:05.790 回答