1

我目前有以下代码,它使用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()或类似的方法,但我找不到这样的东西。

4

3 回答 3

3

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

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

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

于 2012-06-06T17:44:46.560 回答
1

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

我认为您需要做的是使用

getNextEntry

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

于 2012-06-06T17:48:23.550 回答
0

Kotlin 解决方案:

val uncompressedSize = ZipFile(fileName).use { zipFile -> 
  zipFile.entries().asSequence().sumOf { zipEntry -> zipEntry.size } 
}
于 2021-11-02T08:49:42.163 回答