从嵌入式ZIP存档中读取文件

NPE*_*NPE 7 java zip

我有一个ZIP存档,嵌入在一个更大的文件中.我知道存档在较大文件中的起始偏移量及其长度.

是否有任何Java库可以让我直接读取存档中包含的文件?我正在思考ZipFile.getInputStream().不幸的是,ZipFile这个用例不起作用,因为它的构造函数需要一个独立的ZIP文件.

出于性能原因,我无法在打开之前将ZIP achive复制到单独的文件中.

编辑:为了清楚,我确实可以随机访问该文件.

Nee*_*eet 6

我想出了一个快速破解(需要在这里和那里进行消毒),但是它从嵌入在TAR中的ZIP存档中读取文件的内容.它使用Java6,FileInputStream,ZipEntry和ZipInputStream.' 在我的本地机器上工作 ':

final FileInputStream ins = new FileInputStream("archive.tar");
// Zip starts at 0x1f6400, size is not needed
long toSkip = 0x1f6400;
// Safe skipping
while(toSkip > 0)
    toSkip -= ins.skip(toSkip);

final ZipInputStream zipin = new ZipInputStream(ins);
ZipEntry ze;
while((ze = zipin.getNextEntry()) != null)
{
    final byte[] content = new byte[(int)ze.getSize()];
    int offset = 0;
    while(offset < content.length)
    {
        final int read = zipin.read(content, offset, content.length - offset);
        if(read == -1)
            break;
        offset += read;
    }
    // DEBUG: print out ZIP entry name and filesize
    System.out.println(ze + ": " + offset);
}
zipin.close();
Run Code Online (Sandbox Code Playgroud)