从ZipInputStream获取特定文件

时间:2015-04-08 12:59:15

标签: java file-io groovy inputstream zipinputstream

我可以浏览ZipInputStream,但在开始迭代之前,我想获得迭代期间需要的特定文件。我怎么能这样做?

ZipInputStream zin = new ZipInputStream(myInputStream)
while ((entry = zin.getNextEntry()) != null)
 {
    println entry.getName()
}

3 个答案:

答案 0 :(得分:5)

使用ZipEntry上的getName()方法获取所需的文件。

ZipInputStream zin = new ZipInputStream(myInputStream)
String myFile = "foo.txt";
while ((entry = zin.getNextEntry()) != null)
{
    if (entry.getName().equals(myFileName)) {
        // process your file
        // stop looking for your file - you've already found it
        break;
    }
}

从Java 7开始,如果你只需要一个文件并且有一个文件可供阅读,最好使用ZipFile而不是ZipStream:

ZipFile zfile = new ZipFile(aFile);
String myFile = "foo.txt";
ZipEntry entry = zfile.getEntry(myFile);
if (entry) {
     // process your file           
}

答案 1 :(得分:3)

如果您使用的myInputStream来自磁盘上的真实文件,那么您只需使用java.util.zip.ZipFile代替,RandomAccessFile支持InputStream并提供对ZipFile的直接访问权限。按名称压缩条目。但是,如果你拥有的只是一个Content-Length(例如,如果你是在收到来自网络套接字或类似网站时直接处理流),那么你将不得不自己做缓冲。

您可以将流复制到临时文件,然后使用BufferedInputStream打开该文件,或者如果您事先知道数据的最大大小(例如,对于声明其BufferedInputStream bufIn = new BufferedInputStream(myInputStream); bufIn.mark(contentLength); ZipInputStream zipIn = new ZipInputStream(bufIn); boolean foundSpecial = false; while ((entry = zin.getNextEntry()) != null) { if("special.txt".equals(entry.getName())) { // do whatever you need with the special entry foundSpecial = true; break; } } if(foundSpecial) { // rewind bufIn.reset(); zipIn = new ZipInputStream(bufIn); // .... } 的HTTP请求在前面)您可以使用CloseShieldInputStream在内存中缓冲它,直到找到所需的条目。

bufIn

(我自己没有测试过这段代码,你可能会发现在zipIn和第一个bufIn之间使用像commons-io {{1}}之类的东西是允许的第一个拉链流关闭而不关闭底层{{1}},然后再倒回它。)

答案 2 :(得分:2)

查看Finding a file in zip entry

ZipFile file = new ZipFile("file.zip");
ZipInputStream zis = searchImage("foo.png", file);

public searchImage(String name, ZipFile file)
{
  for (ZipEntry e : file.entries){
    if (e.getName().endsWith(name)){
      return file.getInputStream(e);
    }
  }

  return null;
}