java - 当我们调用函数ZipEntry.getSize时,库是否首先在内存中解压缩文件?

标签 java zip

我想在解压缩之前检查 future 未压缩文件的大小。有人可以确认该库不是通过解压缩内存中的文件来获取其最终未压缩大小来启动的吗?

我的代码:

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);
    }
  } 
}

最佳答案

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

现在,关于您正在使用的 Java 实现,取决于平台,但很可能它不会处理文件数据或本地 header ,并且将引用中央目录(或各个中央目录,如果 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() 只是返回该值,而无需进一步检查压缩文件数据。

关于java - 当我们调用函数ZipEntry.getSize时,库是否首先在内存中解压缩文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124017/

相关文章:

java - 在 Java 中使用线程安全集合时,处理并发问题的最佳方法是什么?

java - 我的子类正在从其父类(super class)传递值

java - JSP编译错误对于IBM JDK 1.5 Servlet版本2.5

php - 如何在 PHP 中压缩整个文件夹,甚至是空文件夹?

java - Android传递长值Intent

java - Java中的超时方法

symfony - 如何将 Symfony 发行版下载为 Zip 存档?

c# - 在 C# 中创建保留文件夹结构的 zip 存档

python - 如何通过 Python 2.7 将字节附加到 zip 文件内的文件中?

java - 如何从客户端计算机下载zip文件而不是使用java在浏览器中打开文件?