我有,其内容主要包括字节[],但原来的文件对象是不可访问的zip文件。 我想读每个条目的内容。 我能够从字节一个ByteArrayInputStream创建ZipInputStream,可以读取的条目和他们的名字。 但是我看不到一个简单的方法来提取每个条目的内容。
(我已经看了阿帕奇百科全书,但不能看到一个简单的方法有两种)。
UPDATE @里奇的代码似乎解决问题,谢谢
QUERY为什么这两个例子有* 4(五百十二分之一百二十八和1024 * 4)事半功倍?
我有,其内容主要包括字节[],但原来的文件对象是不可访问的zip文件。 我想读每个条目的内容。 我能够从字节一个ByteArrayInputStream创建ZipInputStream,可以读取的条目和他们的名字。 但是我看不到一个简单的方法来提取每个条目的内容。
(我已经看了阿帕奇百科全书,但不能看到一个简单的方法有两种)。
UPDATE @里奇的代码似乎解决问题,谢谢
QUERY为什么这两个例子有* 4(五百十二分之一百二十八和1024 * 4)事半功倍?
如果要处理来自流嵌套压缩的条目,看到这个答案的想法。 因为内的条目被顺序列出它们可以通过获取每个条目的大小和从该流读取的字节数进行处理。
更新了一个例子副本的每个条目到标准输出:
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
为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();
}
}