【问题标题】:Possible to determine size of file to be unzipped?可以确定要解压缩的文件的大小吗?
【发布时间】:2012-06-06 17:43:36
【问题描述】:

我目前有以下代码,它使用 ZipInputStream 实例将 zip 文件解压缩到手机上的目标位置:

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(sourceZipFile));
ZipEntry zipEntry = null;

while ((zipEntry = zipInputStream.getNextEntry()) != null) {
  File zipEntryFile = new File(targetFolder, zipEntry.getName());
  // write contents of 'zipEntry' to 'zipEntryFile'
}

有谁知道在开始之前是否有可能(使用上述设置或其他设置)获取(估计)要解压缩的文件或字节的总数,以便在解压缩进行时显示进度指示器?我以为ZipInputStream 可能有getTotalEntries() 或类似的方法,但我找不到这样的方法。

【问题讨论】:

    标签: java android zipinputstream


    【解决方案1】:

    Kotlin 解决方案:

    val uncompressedSize = ZipFile(fileName).use { zipFile -> 
      zipFile.entries().asSequence().sumOf { zipEntry -> zipEntry.size } 
    }
    

    【讨论】:

      【解决方案2】:

      使用ZipEntry#getSize() 方法。它返回未压缩文件的大小。

      如果 ZIP 文件中有多个条目(文件),只需先遍历它们(不提取它们),然后将所有文件大小相加。这可能是一个很好的估计。

      请注意,如果您需要知道这些文件将在磁盘上占用的确切字节数,您还需要知道文件系统中 cluster 的确切大小。

      【讨论】:

      • 感谢您的回答。我遇到了一个java.util.zip.ZipFile 类,它有一个size() 方法和一个entries() 方法来访问zip 条目。我正在考虑使用它而不是 ZipInputStream 以避免必须通过 zip 条目进行两次传递。您碰巧知道这两个(ZipFileZipInputStream)类在性能、内存使用等方面是否相似?
      • 我从来没有真正使用过ZipFile。但是请查看this thread
      【解决方案3】:

      正如 npe 所说,ZipEntry 将从 zip 文件中获取文件的未压缩大小。

      我认为您需要做的是使用

      执行一次传递
      getNextEntry
      

      直到完成,沿途计算条目(条目的大小和数量),然后重新开始实际解压

      【讨论】:

      • 请参阅对 npe 答案的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多