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

时间:2012-11-15 14:22:25

标签: java zip zipfile

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

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

资源是一个包,而 zipfile 是一个zip文件。

3 个答案:

答案 0 :(得分:15)

如果您可以确定您的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类访问它。

答案 1 :(得分:3)

您当前的方法肯定不会起作用。你组成了一个任意的“访问”方案,并在一个不知道你想要做什么的类中使用它。 可以 做的是使用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库中。

答案 2 :(得分:0)

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

相关问题