当我们调用函数ZipEntry.getSize时,库首先解压缩内存中的文件吗?

时间:2014-09-30 14:59:37

标签: java zip zipfile

我想在进行解压缩之前检查未来未压缩文件的大小。有人可以通过在内存中解压缩文件来确认库是否无法启动以获得其最终的未压缩大小?

我的代码:

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;

public class ZipGetMethod {
  public static void main(String[] args) {
    String file = "file.zip";
    try {
      ZipFile zipfile = new ZipFile(file);
      Enumeration e = zipfile.entries();
      while (e.hasMoreElements()) {
        ZipEntry zipentry = (ZipEntry) e.nextElement();
        String entryName = zipentry.getName();
        Date lastModify = new Date(zipentry.getTime());
        long uncomSize = zipentry.getSize();
        long comSize = zipentry.getCompressedSize();


    } catch (IOException ex) {
      System.out.println("IOException is : " + ex);
    }
  } 
}

2 个答案:

答案 0 :(得分:2)

ZIP格式将未压缩的文件大小存储为中心目录(http://en.wikipedia.org/wiki/Zip_%28file_format%29#Structure)的一部分,不必处理实际的压缩数据来确定文件大小。

现在,关于您正在使用的Java实现,取决于平台,但很可能它不会处理文件数据或本地标头,并且将引用中央目录(或者如果是zip,则引用各个中心目录文件已附加数据)。

快速浏览OpenJDK实现(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/zip/ZipEntry.java#ZipEntry.getSize%28%29)表明ZipEntry加载了ZIP目录中的文件大小数据,getSize()只返回该值而无需进一步检查压缩数据。< / p>

答案 1 :(得分:1)

没有。每个文件的未压缩大小存储在Zip索引中,因此无需解压缩即可找到给定文件的未压缩大小。