我有一个zip文件,其内容显示为byte [] 但原始文件对象无法访问。我想阅读每个条目的内容。我能够从字节的ByteArrayInputStream创建一个ZipInputStream,并可以读取条目及其名称。但是我看不到提取每个条目内容的简单方法。
(我看过Apache Commons,但看不到那里的简单方法)。
更新 @ Rich的代码似乎解决了这个问题,谢谢
QUERY 为什么两个示例的乘数都是* 4(128/512和1024 * 4)?
答案 0 :(得分:6)
如果要处理流中的嵌套zip条目,请参阅this answer了解相关提示。因为内部条目是按顺序列出的,所以可以通过获取每个条目的大小并从流中读取那么多字节来处理它们。
更新了将每个条目复制到标准输出的示例:
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;
}
}
答案 1 :(得分:0)
它实际上使用ZipInputStream
作为InputStream
(但不要在每个条目的末尾关闭它)。
答案 2 :(得分:0)
计算下一个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();
}
}