1 回答

TA贡献1829条经验 获得超4个赞
ZipInputStream
每次迭代入口指针时,都会丢失入口指针,因为每个 ZipInputStream 对象只允许一个流。
try (ZipInputStream is = new ZipInputStream(Zippy.class.getResourceAsStream("file.zip"))) {
ZipEntry entry;
while ((entry = is.getNextEntry()) != null) {
if (!entry.isDirectory()) {
// do your logic here (get the entry name)
}
is.closeEntry();
}
}
来自javadocs:
closeEntry() -Closes the current ZIP entry and positions the stream for reading the next entry.
getNextEntry() - Reads the next ZIP file entry and positions the stream at the beginning of the entry data.
基本上,您在任何给定时间只能打开一个条目。
因此,如果你想做你正在做的事情,你能做的最好的就是保存 zip 条目的名称并遍历 ZipInputStream 以将指针移动到正确的位置,然后你可以使用 ZipInputStream.read() 来获取字节。
压缩文件
如果您可以使用 ZipFile 对象(而不是 ZipInputStream),您就可以做您想要完成的事情。
static void loadMap() throws IOException {
ZipFile file = new ZipFile("testzip.zip");
Enumeration<? extends ZipEntry> entries = file.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (!entry.isDirectory()) {
streamMap.put(entry.getName(), new BufferedReader(new InputStreamReader(file.getInputStream(entry))));
}
}
}
public static void main(String[] args) throws IOException {
loadMap();
Iterator<BufferedReader> iter = streamMap.values().iterator();
while (iter.hasNext()) {
BufferedReader reader = iter.next();
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
OUTPUT:
file 2: First line!
file 2: Second Line!
file 1: First line!
file 1 : Second Line!
BUILD SUCCESSFUL (total time: 0 seconds)
您只需要记住保存 zip 文件引用并file.close();在完成后调用。
添加回答
举报