从ZipInputStream获取ZipEntry的getInputStream(不使用ZipFile类)

35
我怎样才能从一个ZipInputStream中获取一个ZipEntry的InputStream,而不使用ZipFile类呢?

这个答案怎么样,是不是更好一些呢? ZipFile zipFile = new ZipFile(filePath); ZipEntry entry = zipFile.getEntry(entryName); InputStream inputStream = zipFile.getInputStream(entry); - kirhgoff
3个回答

22

它的工作方式是这样的

static InputStream getInputStream(File zip, String entry) throws IOException {
    ZipInputStream zin = new ZipInputStream(new FileInputStream(zip));
    for (ZipEntry e; (e = zin.getNextEntry()) != null;) {
        if (e.getName().equals(entry)) {
            return zin;
        }
    }
    throw new EOFException("Cannot find " + entry);
}

public static void main(String[] args) throws Exception {
    InputStream in = getInputStream(new File("f:/1.zip"), "launch4j/LICENSE.txt");
    Scanner sc = new Scanner(in);
    while(sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }
    in.close();
}

谢谢,但我的意思是实例化一个新的InputStream对象,可以在以后或需要时使用,而不是一个接一个地输入。 - Mohammad Hassany
1
ZipInputStream zipInputStream = new ZipInputStream(jar.openStream()); 开始,它会如何工作? - David Williams
这是什么?!它总是返回ZipInputStream zin;对象 - 这是一个用于zip存档的对象。 而且对于所有条目都是一样的 :-| - undefined

21

Err,ZipInputStream 已经是一个 InputStream。你不需要另一个。获取下一个 ZipEntry 会将流定位到条目的开头。请参阅Javadoc。


2
为了返回一组可稍后使用的输入流列表,我使用了以下方法:
public static List<InputStream> listResourcesInJar(URL jar) throws IOException{
    ZipInputStream zipInputStream = new ZipInputStream(jar.openStream());
    ZipEntry zipEntry = null;

    List<InputStream> inputStreams = new ArrayList<>();

    while ((zipEntry = zipInputStream.getNextEntry()) != null) {
        String entryName = zipEntry.getName();
        if (entryName.endsWith(".xsd")) {
            inputStreams.add(convertToInputStream(zipInputStream));
        }
    }
    return inputStreams;
}

private static InputStream convertToInputStream(final ZipInputStream inputStreamIn) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    IOUtils.copy(inputStreamIn, out);
    return new ByteArrayInputStream(out.toByteArray());
}

1
这会将整个ZIP文件加载到内存中。这不是一个好主意;不可扩展;也不是所要求的。 - user207421

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