直接读取Zip文件中的文件 – Java

我的情况是我有一个包含一些文件(txt,png,…)的zip文件,我想直接用它们的名字来读它,我测试了下面的代码但没有结果(NullPointerExcepion):

InputStream in = Main.class.getResourceAsStream("/resouces/zipfile/test.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 

resources是一个包, zipfile是一个zip文件。

如果您可以确定您的zip文件永远不会被打包到另一个jar中,您可以使用以下内容:

 URL zipUrl = Main.class.getResource("/resources/zipfile.zip"); URL entryUrl = new URL("jar:" + zipUrl + "!/test.txt"); InputStream is = entryUrl.openStream(); 

要么:

 URL zipUrl = Main.class.getResource("/resources/zipfile.zip"); File zipFile = new File(zipUrl.toURI()); ZipFile zip = new ZipFile(zipFile); InputStream is = zip.getInputStream(zip.getEntry("test.txt")); 

否则,您的选择是:

  • 对于需要加载的每个条目,使用ZipInputStream扫描zip文件一次。 如果您拥有大量资源,这可能会很慢,除非您可以为所有资源重用相同的ZipInputStream。
  • 不要将资源打包到嵌套的zip文件中,只需使用代码在jar中内嵌它们。
  • 将嵌套的zip文件复制到临时目录中,然后使用ZipFile类访问它。

你当前的方法绝对不会起作用。 你组成了一个任意的“访问”方案,并在一个不知道你想要做什么的类中使用它。 你可以做的是使用ZipInputStream来读取你要查找的条目:

 URL zipFileURL = Thread.currentThread().getContextClassLoader().getResource("zipfile.zip"); InputStream inputStream = zipFileURL.openStream(); ZipInputStream zipInputStream = new ZipInputStream(inputStream); ZipEntry zipEntry = null; do { zipEntry = zipInputStream.getNextEntry(); if(zipEntry == null) break; } while(zipEntry != null && (! "textfile".equals(zipEntry.getName())); if(zipEntry != null ) { // do some stuff } 

这是特殊代码,修复它以满足您的需求。 此外,可能有一些更有效的类来处理Zip文件,例如在Apache Commons IO库中。

zip文件中test.txt的路径是什么? 您需要使用zip文件中的路径来读取此文件。 还要确保您的zipfile位于类路径中。 实际上,您可以将其捆绑在一个jar文件中。