获取ZipInputStream的大小

7

在我们完全读取流之前,有没有办法找到/估计ZipInputStream的大小?

例如,在我们读取userdata之前,我们可以使用getNextEntry获取条目的元数据。

Inputstream有一个available()方法,可以返回可以从此输入流中读取的字节数的估计值,但我找不到类似的方法来处理ZipInputStream。


你有访问流所在的 ZipFile 的权限吗? - Thilo
不行。我们只有一个流进来。我想知道在读取完整个流之前是否有一种方法可以获取元数据。 - Pradeep Vairamani
3个回答

3

ZipInputStream有一个available()方法,但它只返回0或1。

为了获取任何类型文件的预估大小,您可以使用FileInputStream,然后使用ZipInputStream来读取zip文件。例如:

 public class ZipUtil {

    public static void main(String[] args) throws Exception {
        ZipInputStream zis = null;

        FileInputStream fis = new FileInputStream("C:/catalina.zip");
        int size = fis.available();
        System.out.println("size in KB : " + size/1024);
        zis = new ZipInputStream(fis);        

        ZipEntry ze;
        while ((ze = zis.getNextEntry()) != null) {
            System.out.println(ze.getName());
        }
    }
}

这种方法的问题在于我没有一个可以转换为FileInputStream的zip文件,我只有一个ZipInputStream可供使用。 - Pradeep Vairamani
1
Javadoc中有一个特定的警告,不要使用available()作为总大小值。 - user207421

3
如果你只有流,那么我认为不行。 zip文件格式只有一个条目序列,然后是全局目录(其中包含所有文件及其大小的表),在最后。因此,如果没有访问该文件的权限,您将无法获取到该信息。

1
Inputstream有一个可用的方法available(),可以返回从此输入流中可以读取的字节数的估计值,而不会阻塞。这并不是同一件事情。在Javadoc中有一个特定的警告,不要将此值视为总文件大小。
但是我找不到ZipInputStream的类似方法,这很奇怪,因为它确实存在。然而,它返回零,这是它可以做出的最佳估计,即可以读取多少字节而不会阻塞。
为什么?因为(a)它是一个流,(ii)它是一个压缩的流。没有办法知道有多少内容需要读取;也没有办法知道其中多少可以在不阻塞的情况下读取。

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