如何在Java中找到Zip文件条目的文件偏移量?

时间:2011-08-12 22:24:24

标签: java zip

我有一个ZipFile,我想创建一个数组,其中包含每个条目的偏移量/大小。这样C ++层(JNI)就可以直接读取这些子文件而无需提取它们。

我可以使用entry.getCompressedSize()获取文件的压缩大小,但是我没有看到任何内容来找出zip中文件的偏移量。

Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
while (zipEntries.hasMoreElements())
{
    ZipEntry zip = (ZipEntry)zipEntries.nextElement();
    //long offset = ?
    long fileSize = zip.getCompressedSize();
}

任何简单的方法来获得这个?

1 个答案:

答案 0 :(得分:2)

我读到条目由.entries()按照它们在文件中出现的确切顺序返回(不确定这是指实际文件还是标题条目。)假设是这种情况,以下解决了问题:

Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
long offset = 0;
while (zipEntries.hasMoreElements())
{
    ZipEntry entry = (ZipEntry)zipEntries.nextElement();
    long fileSize = 0;
    long extra = entry.getExtra() == null ? 0 : entry.getExtra().length;
    offset += 30 + entry.getName().length() + extra;
    if(!entry.isDirectory())
    {
        fileSize = entry.getCompressedSize();

        // Do stuff here with fileSize & offset
    }    
    offset += fileSize;
}

这适合我的情况。唯一需要注意的是,根据ZIP压缩规范,并非所有zip文件中的文件都以与目录中完全相同的顺序存储。因为在我的情况下我控制了zip文件的构造,这不是问题,但是如果你使用来自不受控制的源的拉链,这种方法可能不起作用。