如何将InputStream转换为ZIP格式?

时间:2010-11-11 22:00:30

标签: java zip dwr

我有一个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

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

3 个答案:

答案 0 :(得分:4)

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

为清楚起见,在this input example中,您应该执行以下操作:

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

正如Don Roby所说,如果你只想复制,你不需要知道文件结构,你可以使用例如static 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()) {
  ...

请注意javadoc of getNextEntry()

  

读取下一个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?
  ...
}

我认为你可以看到差异:)

答案 1 :(得分:2)

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

如果您必须将zip文件的内容作为单独的文件提取,即以编程方式解压缩,

ZipInputStream非常有用。另一方面,如果您有内容并需要将它们组合成一个zip文件,则使用ZipOutputStream

答案 2 :(得分:-1)

文件/ CreateZipOutputStreamfromFileOutputStream.htm“> HTTP://www.java2s.com/Tutorial/Java/0180_File/CreateZipOutputStreamfromFileOutputStream.htm

文件/ CompressingStreamsZipperJavaexample.htm“> HTTP://www.java2s.com/Tutorial/Java/0180_File/CompressingStreamsZipperJavaexample.htm