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

Posted

技术标签:

【中文标题】直接读取 Zip 文件中的文件 - Java【英文标题】:Read directly a file within a Zip file - Java 【发布时间】:2012-11-15 14:22:24 【问题描述】:

我的情况是我有一个包含一些文件(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 文件。

【问题讨论】:

是的,那肯定行不通。 你需要java.util.zip docs.oracle.com/javase/6/docs/api/java/util/zip/… 压缩文件是否在类路径中??它必须是 @chrislhardin:你是对的,如果我将 zipFile.zip 添加到类路径中它工作正常,所以它也是一个解决方案 (+1) 【参考方案1】:

如果你可以确定你的 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,使用ZipFile类直接获取then entry比扫描整个流高效得多。 你能解释一下你的第一行吗(如果你能... 当然。如果包含资源的 zip 文件包含在 jar 中,则代码示例将不起作用。我的意思是 zip 文件必须是文件系统上的真实文件,而不是 JAR 条目。 如何做到这一点,我的意思是当我想生成我的项目的jar时如何使它成为一个真实的文件?也欢迎任何资源! 很难说,不知道你的项目将如何部署。如果您的类路径中有一个目录,其中包含一个名为 resources 的子目录,而该子目录又包含您的 zip 文件,则可以使用(您可能需要将 Main.class.getResource("/resources/...") 更改为 Main.class.getClassLoader().getResource("resources/..."))。如果是我,我可能会把资源和代码打包在同一个jar中,所以我一开始就没有这个问题。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于直接读取 Zip 文件中的文件 - Java的主要内容,如果未能解决你的问题,请参考以下文章

java 读取zip里面的文件夹

如何在不使用临时文件的情况下从 Java 中的嵌套 zip 文件中读取数据?

java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

java 下载异地FTP中的zip文件

从 Zip 文件中的文件中读取内容

java怎么读取Zip和RAR里面的文件啊?