Java ZipEntry的GetSize返回-1。

10

Java zipEntry.getSize() 方法返回实际文件的大小,有时会返回-1(尽管文件大小大于0)。

Java API文档中说:“返回条目数据的未压缩大小,如果不知道则为-1。”

不确定在什么情况下它会返回-1,即在什么情况下它是未知的?


顺便提一下,如果在读取ZipEntry流后调用getSize,则会返回正确的大小。很奇怪。 - rogerdpack
3个回答

10
使用ZipFile而不是ZipInputStream来获取条目,可以使getSize和getCompressedSize返回正确的值。
     ZipFile zipfile = new ZipFile("myFile.zip"); 
     java.util.Enumeration zipEnum = zipfile.entries();
     while (zipEnum.hasMoreElements ()) 
     { 
        ZipEntry entry = (ZipEntry) zipEnum.nextElement(); 
        if (! entry.isDirectory ())
        {
            // entry.getName()
            // entry.getSize ()
            // entry.getCompressedSize ()
         }
     }

发现的技巧可在http://vimalathithen.blogspot.de/2006/06/using-zipentrygetsize.html找到。


1

如果ZipFile entry表中的内容是-1,那么您将得到一个返回值。这只是zip文件格式定义的一个方面。


即使使用size函数将大小写入zip表格,我仍然得到-1。 - Johann

0

这段代码将返回zipEntry的正确大小:

ZipInputStream( BufferedInputStream( cr.openInputStream(zipUri) ) ).use { srcZipStream ->
        var zipEntry: ZipEntry?
        while (srcZipStream.nextEntry.also { zipEntry = it} != null) {
            srcZipStream.closeEntry()
            allZipEntryList.add(zipEntry!!.name)
            Log.e("wkExtract",zipEntry!!.name+" size= "+zipEntry!!.size+" compressed size= "+zipEntry!!.compressedSize)
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接