商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > ZipFile.entries遍历变量压缩包内所有文件

ZipFile.entries遍历变量压缩包内所有文件

  发布于2026-07-06 阅读(0)

扫一扫,手机访问

提到用 Ja va 操作 ZIP 文件,ZipFile.entries() 这个方法可以说是基本功中的基本功,没有太多花哨,但非常实用。它的核心思路很简单:拿到一个 Enumeration,一个接一个地把里面的条目拎出来,再根据条目对象获取名称、类型、大小这些信息。下面把这几种常见用法拆开来说。

基础遍历:列出所有条目名称

这是日常工作中最频繁的场景。打开 ZIP 文件,调用 entries(),然后循环取出每个 ZipEntry 的名字就行。整个过程没什么玄机,但有几个细节值得养成习惯:

  • ZIP 文件的路径必须正确,文件必须存在,否则构造 ZipFile 时会直接抛出 IOException——这事早处理比晚处理要好。
  • entries() 返回的是老式的 Enumeration,所以遍历时要搭配 hasMoreElements()nextElement() 这对搭档,顺序不能乱。
  • getName() 返回的是 ZIP 内部的完整路径,比如 "docs/readme.txt" 或者 "images/logo.png",目录结构会原样保留在名字里。
  • 遍历结束后,别忘了调用 zipFile.close()。资源泄漏这种问题,多数时候不会立刻报错,但积累起来会让人头疼。

区分文件与目录

ZIP 包里有文件和文件夹,那怎么区分?ZipEntry 自己提供了一个方法 isDirectory(),直接告诉你答案:

  • 返回 true 的条目是目录,路径通常以 / 结尾,比如 "src/main/ja va/"
  • 返回 false 的就是普通文件,比如 "pom.xml"
  • 这里有个坑需要留意:某些 ZIP 压缩工具并不会显式地把目录作为一个独立条目写入。换句话说,你只能靠文件路径里的 / 分隔符来推断层级结构。所以在判断时,isDirectory() 优先,路径分隔符作为辅助会更稳妥。

统计或筛选特定文件

遍历时不妨做点更有意思的事情,比如统计某些类型的文件数量,或者把符合要求的文件路径收集起来。举个例子:

  • fileName.endsWith(".json") 可以筛选出所有 JSON 文件,同理其他后缀也一样处理。
  • 通过 entry.getSize() 可以拿到未压缩的文件大小。不过要注意,如果 ZIP 是通过流式写入生成的,这个方法返回的可能就是 -1,表示大小未知。
  • 如果只是计数,没必要把每个 entry 都存下来,直接递增一个整型变量就够了。
  • 如果需要记录路径,用 List 来存 entry.getName() 的结果,简单直接。

读取某个文件的内容

要真正读取某个条目的具体内容,就需要用到 zipFile.getInputStream(entry) 了。这一步有几点值得强调:

  • 必须在 ZipFile 尚未关闭的情况下调用 getInputStream,否则会抛出 IllegalStateException。这个逻辑其实很自然:文件都关了,流自然没法读。
  • 推荐使用 try-with-resources 来管理 InputStream,这是 Ja va 7 之后的标准做法,能确保流被正确关闭,少写很多烦人的 finally 代码。
  • 读取文本内容时,字符集一定不要含糊。直接用 new String(bytes, StandardCharsets.UTF_8) 是最稳妥的选择,否则在不同环境下解码出来的内容可能乱码。
  • 大文件不要一股脑全部读入内存,分块处理才是明智的做法。毕竟内存不是无限的,一旦 ZIP 里藏着几百兆的文件,一次性读取会非常危险。

说到这就差不多了。操作 ZIP 文件的这几招,基本覆盖了日常开发中最常见的场景。掌握好它们,应对压缩包处理的任务会顺手很多。

本文转载于:https://www.php.cn/faq/2447422.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注