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

如何在Java中找到ZipFile条目的文件偏移量?,java,zip,Java,Zip,我有一个ZipFile,我想创建一个数组,其中包含每个条目的偏移量/大小。这样,C++层(JNI)可以直接读取这些子文件而不必提取它们。 我可以使用entry.getCompressedSize()获取文件的压缩大小,但我看不到任何东西可以找到zip中文件的偏移量 Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); while (zipEntries.hasMoreElements()) { ZipE

我有一个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();
}

Enumeration我了解到.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;
}

enumeration您真正想解决的问题是什么?总的来说,这听起来像是一种奇怪的技术方法。。。我有一个使用Android NDK r4构建的项目,它不允许本地代码直接访问项目资产。我通过将偏移量/文件大小传递给本机代码,并重写文件操作,使用文件中的开始/结束位置直接从资产文件加载值来解决这个问题。由于我无法进入(nda)的原因,我现在需要读取一个额外的.zip文件,并且我没有AssetFileDescriptor来获取此信息。如果您找不到解决方案,您仍然可以使用Java解压,并从temp或内存(如果您不敢将数据存储在任何地方)提供文件内容,偏移量由30字节的标准zip头信息+文件名长度+一些可能的额外操作系统特定标志+数据本身组成。要注意的是,我遇到了一个错误,Java错误地返回了.getExtra(),其中的字节数组实际上不在文件中。因为我可以控制我的压缩过程,所以我知道它的正确值是零,所以我删除了这个术语。如果你需要做类似的事情,你应该注意一些值得注意的事情。