发布于2026-07-06 阅读(0)
扫一扫,手机访问
提到用 Ja va 操作 ZIP 文件,ZipFile.entries() 这个方法可以说是基本功中的基本功,没有太多花哨,但非常实用。它的核心思路很简单:拿到一个 Enumeration extends ZipEntry>,一个接一个地把里面的条目拎出来,再根据条目对象获取名称、类型、大小这些信息。下面把这几种常见用法拆开来说。
这是日常工作中最频繁的场景。打开 ZIP 文件,调用 entries(),然后循环取出每个 ZipEntry 的名字就行。整个过程没什么玄机,但有几个细节值得养成习惯:
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"。/ 分隔符来推断层级结构。所以在判断时,isDirectory() 优先,路径分隔符作为辅助会更稳妥。遍历时不妨做点更有意思的事情,比如统计某些类型的文件数量,或者把符合要求的文件路径收集起来。举个例子:
fileName.endsWith(".json") 可以筛选出所有 JSON 文件,同理其他后缀也一样处理。entry.getSize() 可以拿到未压缩的文件大小。不过要注意,如果 ZIP 是通过流式写入生成的,这个方法返回的可能就是 -1,表示大小未知。List 来存 entry.getName() 的结果,简单直接。要真正读取某个条目的具体内容,就需要用到 zipFile.getInputStream(entry) 了。这一步有几点值得强调:
ZipFile 尚未关闭的情况下调用 getInputStream,否则会抛出 IllegalStateException。这个逻辑其实很自然:文件都关了,流自然没法读。try-with-resources 来管理 InputStream,这是 Ja va 7 之后的标准做法,能确保流被正确关闭,少写很多烦人的 finally 代码。new String(bytes, StandardCharsets.UTF_8) 是最稳妥的选择,否则在不同环境下解码出来的内容可能乱码。说到这就差不多了。操作 ZIP 文件的这几招,基本覆盖了日常开发中最常见的场景。掌握好它们,应对压缩包处理的任务会顺手很多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8