我有一个ZIP存档,它嵌入在一个更大的文件中。我知道存档在较大文件中的起始偏移量及其长度。
是否有任何Java库可以让我直接读取存档中包含的文件?我在想ZipFile.getInputStream()
。不幸的是,ZipFile
不适用于此用例,因为它的构造函数需要一个独立的ZIP文件。
出于性能原因,我无法在打开之前将ZIP achive复制到单独的文件中。
编辑:为了清楚起见,我确实可以随机访问该文件。
答案 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(..);
将其放置在嵌入式zipfile的开头: fis.skip(偏移);
打开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-JavaBinding是7-zip C ++库的Java包装器。
code snippets页面特别有一些很好的例子,包括打印档案中的项目列表,提取单个文件以及打开多部分档案。
答案 6 :(得分:-1)