如何在不使用 ZipFile 类的情况下从 ZipInputStream 获取 ZipEntry 的 InputStream ?
ZipFile
ZipInputStream
ZipEntry
InputStream
它以这种方式工作
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 .
InputStream.
要返回稍后可以使用的输入流列表,我使用了以下内容
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()); }
3 回答
它以这种方式工作
呃,
ZipInputStream
已经InputStream.
你不需要另一个 . 获取下一个ZipEntry
将流放在条目的开头 . 见Javadoc .要返回稍后可以使用的输入流列表,我使用了以下内容