如何在内存中提取zip文件



我读过很多关于在磁盘上提取zip文件的主题。但我有一个用例,zip需要在内存中提取。ZIP文件再次包含ZIP文件的列表。我是在浏览了堆栈溢出中的几个帖子后提出这个问题的。你能分享任何关于如何在内存中解压缩文件的帖子/链接吗?

如果您想读取嵌套的.zip文件,可以尝试使用ZipInputStream(就像前面提到的那样(并检查ZipEntry(s(是否也是*.zip文件,在这种情况下,它可以作为下一个.zip文件递归读取。类似于:

private static void readZipInputStream(
InputStream inputStream, BiConsumer<ZipEntry, ByteArrayOutputStream> consumerFunction) throws IOException {
try (ZipInputStream zipInput = new ZipInputStream(inputStream)) {
ZipEntry entry;
while ((entry = zipInput.getNextEntry()) != null) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = zipInput.read(buffer)) != -1) {
outStream.write(buffer, 0, length);
}
if (entry.getName().endsWith(".zip")) {
// need to go deeper...
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
readZipInputStream(inStream, consumerFunction);
} else {
// do something...
consumerFunction.accept(entry, outStream);
}
}
}
}

例如,有一个zip文件,其结构如下:

file.zip
├─1+2.zip
│ ├─1.zip
│ │ └─1.txt
│ └─2.zip
│   └─2.txt
└─3.zip
└─3.txt

使用CCD_ 3函数如下:

public class Application {
public static void main(String[] args) throws IOException {
String path = "file.zip";
try (FileInputStream inputStream = new FileInputStream(Paths.get(path).toFile())) {
readZipInputStream(
inputStream,
(entry, outputStream) -> {
System.out.println(entry.getName());
System.out.println("--------------------------------");
System.out.println(outputStream.toString());
System.out.println("--------------------------------");
}
);
}
}
}

将打印三个.txt文件的内容:

1.txt
--------------------------------
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
--------------------------------
2.txt
--------------------------------
- Integer vel sem consectetur, ullamcorper leo quis, consequat mauris.
- Nulla efficitur sapien at velit fermentum condimentum.
- Vestibulum elementum nulla ut ipsum tempus, ut molestie sem sollicitudin.
--------------------------------
3.txt
--------------------------------
Morbi tincidunt ornare mi. Sed id risus tortor. Interdum et malesuada 
fames ac ante ipsum primis in faucibus. Pellentesque tincidunt, 
nulla a interdum porta, orci elit ultricies leo, in maximus orci 
tortor pulvinar est. Curabitur eget fermentum risus. Vestibulum euismod 
convallis eros, nec blandit neque blandit at.
--------------------------------

java类java.util.zip.ZipInputStream允许您将zip存档中的数据读取到字节数组中。

最新更新