我有一个 zip 文件,其内容显示为 byte[]但原始文件对象不可访问。我想阅读每个条目的内容。我能够从字节的 ByteArrayInputStream 创建一个 ZipInputStream,并且可以读取条目及其名称。但是,我看不到提取每个条目内容的简单方法。
(我看过 Apache Commons,但也看不到简单的方法)。
更新@Rich的代码似乎解决了这个问题,谢谢
QUERY为什么这两个例子的乘数都是 * 4 (128/512 and 1024*4) ?
我有一个 zip 文件,其内容显示为 byte[]但原始文件对象不可访问。我想阅读每个条目的内容。我能够从字节的 ByteArrayInputStream 创建一个 ZipInputStream,并且可以读取条目及其名称。但是,我看不到提取每个条目内容的简单方法。
(我看过 Apache Commons,但也看不到简单的方法)。
更新@Rich的代码似乎解决了这个问题,谢谢
QUERY为什么这两个例子的乘数都是 * 4 (128/512 and 1024*4) ?
如果要处理流中的嵌套 zip 条目,请参阅此答案以获取想法。因为内部条目是按顺序列出的,所以可以通过获取每个条目的大小并从流中读取那么多字节来处理它们。
更新了一个将每个条目复制到标准输出的示例:
ZipInputStream is;//obtained earlier
ZipEntry entry = is.getNextEntry();
while(entry != null) {
copyStream(is, out, entry);
entry = is.getNextEntry();
}
...
private static void copyStream(InputStream in, OutputStream out,
ZipEntry entry) throws IOException {
byte[] buffer = new byte[1024 * 4];
long count = 0;
int n = 0;
long size = entry.getSize();
while (-1 != (n = in.read(buffer)) && count < size) {
out.write(buffer, 0, n);
count += n;
}
}
它实际上使用ZipInputStream
as the InputStream
(但不要在每个条目的末尾关闭它)。
计算下一个 ZipEntry 的开始有点棘手。请参阅 JDK 6 中包含的此示例,
public static void main(String[] args) {
try {
ZipInputStream is = new ZipInputStream(System.in);
ZipEntry ze;
byte[] buf = new byte[128];
int len;
while ((ze = is.getNextEntry()) != null) {
System.out.println("----------- " + ze);
// Determine the number of bytes to skip and skip them.
int skip = (int)ze.getSize() - 128;
while (skip > 0) {
skip -= is.skip(Math.min(skip, 512));
}
// Read the remaining bytes and if it's printable, print them.
out: while ((len = is.read(buf)) >= 0) {
for (int i=0; i<len; i++) {
if ((buf[i]&0xFF) >= 0x80) {
System.out.println("**** UNPRINTABLE ****");
// This isn't really necessary since getNextEntry()
// automatically calls it.
is.closeEntry();
// Get the next zip entry.
break out;
}
}
System.out.write(buf, 0, len);
}
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}