来自ZipInputStream的ZipEntry的getInputStream(不使用ZipFile类)

如何在不使用ZipFile类的情况下从ZipInputStream获取ZipEntryInputStream

它以这种方式工作

 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(); } 

错误, ZipInputStream已经是一个InputStream. 你不需要另一个。 获取下一个ZipEntry将流定位在条目的开头。 见Javadoc。

要返回稍后可以使用的输入流列表,我使用了以下内容

 public static List listResourcesInJar(URL jar) throws IOException{ ZipInputStream zipInputStream = new ZipInputStream(jar.openStream()); ZipEntry zipEntry = null; List 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()); }