【问题标题】:Efficient way to read a small file from a very large Zip file in Java从 Java 中非常大的 Zip 文件中读取小文件的有效方法
【发布时间】:2021-10-22 03:23:04
【问题描述】:

我想知道是否有任何有效的方法可以从一个非常大的 zip 文件中读取一个小文件。我对 zip 中的任何其他文件不感兴趣,除了一个名为 inventory.xml 的小文件。

确切地说,zip 文件位于 artifactory 中。所以我也不想将整个文件下载到我的磁盘中。这是我现在所拥有的。

URL url = new URL("artifactory-url");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    int status = con.getResponseCode();
    if (status != 200) {
        System.out.println("Unable to find the artifact : " + url.toString());
        return bugs;
    }
    try (ZipInputStream zipStream = new ZipInputStream(con.getInputStream())) {
        ZipEntry entry;
        while ((entry = zipStream.getNextEntry()) != null) {
            if (entry.getName().contains("inventory.xml")) {
                //do something here
            }

        }
    }

另一个问题是,如果我知道文件的坐标,会有帮助吗?

【问题讨论】:

  • 这段代码效率不高吗?
  • @DhanasekaranDon 它遍历每个 zipentry,如果它是一个包含很多条目的巨大 zip 文件,则需要很长时间。
  • 对此您无能为力。这是一种顺序格式。确保在处理完所需文件后跳出循环。
  • con.getInputStream() 获取完整文件,因此您不能只获取文件的一部分。正如@user207421 所说,您对此无能为力。
  • @Renis1235 getInputStream() 返回输入流。然后,您必须根据需要从中读取数据。您还没有下载整个文件。只是您阅读的部分。

标签: java zip zipinputstream


【解决方案1】:

ZIP 文件将它们的目录存储在文件的末尾,所以如果你有办法随机访问文件的内容,你可以这样做。

但是,这是一个很大的“如果”:它需要 Artifactory 支持字节范围的 GET,并且需要您重新实现(或查找/调整)代码以读取目录结构并从中间检索文件存档。

如果您需要经常这样做,更好的解决方案是首先更改将这些文件放入 Artifactory 的过程。如果它被打包在由 Maven 或其他构建工具生成的 JAR 中,那么只需将文件提取到它们自己的依赖项中即可。

【讨论】:

    【解决方案2】:

    正如你们中的许多人所提到的,问题本身中提到的代码可能是最有效的解决方案。无论如何,谢谢你的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 2016-09-05
      • 2018-02-23
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多