我有一个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();
}
任何简单的方法来获得这个?
答案 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文件的构造,这不是问题,但是如果你使用来自不受控制的源的拉链,这种方法可能不起作用。