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

时间:2012-03-26 12:51:12

标签: java zip

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

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

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

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

7 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

1.create FileInputStream fis = new FileInputStream(..);

  1. 将其放置在嵌入式zipfile的开头: fis.skip(偏移);

  2. 打开ZipInputStream(fis)

答案 2 :(得分:1)

我建议使用TrueZIP,它提供对多种档案的文件系统访问。它过去对我很有用。

答案 3 :(得分:0)

如果您使用的是Java SE 7,它会提供一个zip文件系统,允许您直接读取/写入zip文件:http://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html

答案 4 :(得分:0)

I think apache commons compress may help you.

There is a class org.apache.commons.compress.archivers.zip.ZipArchiveEntry, which inherit java.util.zip.ZipEntry.

It has a method getDataOffset(), that can get the offset of data stream within the archive file.

答案 5 :(得分:-1)

7-zip-JavaBinding7-zip C ++库的Java包装器。

code snippets页面特别有一些很好的例子,包括打印档案中的项目列表,提取单个文件以及打开多部分档案。

答案 6 :(得分:-1)

检查zip4j是否有帮助。

您可以尝试PartInputStream根据您的使用案例阅读zip文件。

我认为创建临时zip文件然后访问它会更好。