【问题标题】:How does one access a file within a directory in a zip file without creating any new files?如何在不创建任何新文件的情况下访问 zip 文件中目录中的文件?
【发布时间】:2012-08-03 00:55:36
【问题描述】:

我正在处理一个需要访问多个嵌入式 zip 文件和目录中的文件的 java 项目。

例如,archive1.zip/archive1/archive2.zip/archive2/directory1/file_that_I_need.txt。

如果在提取每个 zip 文件时,它会立即列出其内容,但里面有一个包含所有内容的文件夹。

我在网上找到的示例涉及 zip 文件,这些文件在提取时包含他们需要访问的文件,但我找不到任何涉及访问 zip 文件目录中的文件的示例。任何关于这方面的建议都会很棒。

谢谢!

【问题讨论】:

  • 没有区别。您在 ZIP 文件中提供可以包含目录的路径。
  • 我不确定我是否理解这一点。你的意思是这样的代码:zis = ZipInputStream(new FileInputStream(file));会工作?假设 File file = new File("archive1.zip/archive1/archive2.zip").
  • 从拉链内部加载拉链有点疯狂,但你可以做到。您需要遍历archive1.zip 的条目,直到找到archive2.zip 的InputStream。在上面使用 ZipInputStream,您需要扫描它以查找您实际需要的文件。
  • archive1.zip 的唯一条目虽然是一个目录。如何访问该目录中的文件?

标签: java unzip zip


【解决方案1】:

鉴于禁止创建新文件,您几乎只能使用ZipInputStream。当您找到与嵌入存档相对应的ZipEntry 时,您可以读取其流以找到实际文件。您可以递归处理任意多个级别的存档。

如果您要处理单个文件,这可以正常工作。但是,重新读取多个文件的存档可能会很昂贵。更好的解决方案是至少以ZipFile 的形式打开外部存档,它会映射实际文件。

如果您随后可以将包含的存档解压缩到一个临时目录并以ZipFiles 的形式打开它们,您可能会看到速度大大提高(只要您从每个嵌入式存档中提取多个文件) .

【讨论】:

  • 谢谢,你的第一段看起来像我想走的路。那该怎么做呢?

    代码如下:
    ZipInputStream zipInputStream = new ZipInputStream( new FileInputStream("archive1.zip") ;

    //插入循环这里 ZipEntry zipEntry = zipInputStream.getNextEntry() ;

    getNextEntry() 是否也会递归地进入目录?
  • 对不起,我是新来的,格式很糟糕。本质上,使用函数 zipInputStream.getNextEntry() 会递归返回嵌入目录中的文件吗??
  • 我会编写一个函数ZipInputStream findFile(ZipInputStream in, String name) 迭代in 中的所有条目,并返回匹配name 的条目的流。您可以预先分解路径(在这种情况下它实际上是迭代的),或者在方法内部分解它(在这种情况下它是递归的)。
  • 另外:阅读 ZipInputStream 关于关闭流的文档。您不想过早关闭您的信息流。
  • 感谢您的提示,这真的很有帮助。我认为迭代“in”中的条目的最佳方法是getNextEntry。如果 zip 文件包含一个包含文件的目录怎么办。 getNextEntry 将只返回目录的名称还是会进入目录并返回其中的文件?
【解决方案2】:

您还可以查看http://truezip.java.net/ 我使用的是它的旧版本,它比 Java 内置的支持功能强大得多。我认为还有一个 Apache Commons 库用于从嵌套归档结构中读取文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多