66 lines
1.4 KiB
Java
66 lines
1.4 KiB
Java
|
|
package net.filebot.vfs;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipInputStream;
|
|
|
|
import net.filebot.util.ByteBufferInputStream;
|
|
import net.filebot.util.ByteBufferOutputStream;
|
|
|
|
|
|
public class ZipArchive implements Iterable<MemoryFile> {
|
|
|
|
private final ByteBuffer data;
|
|
|
|
|
|
public ZipArchive(ByteBuffer data) {
|
|
this.data = data.duplicate();
|
|
}
|
|
|
|
|
|
@Override
|
|
public Iterator<MemoryFile> iterator() {
|
|
try {
|
|
return extract().iterator();
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
|
|
public List<MemoryFile> extract() throws IOException {
|
|
List<MemoryFile> vfs = new ArrayList<MemoryFile>();
|
|
|
|
// read first zip entry
|
|
ZipInputStream zipInputStream = new ZipInputStream(new ByteBufferInputStream(data.duplicate()));
|
|
ZipEntry zipEntry;
|
|
|
|
try {
|
|
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
|
|
// ignore directory entries
|
|
if (zipEntry.isDirectory()) {
|
|
continue;
|
|
}
|
|
|
|
ByteBufferOutputStream buffer = new ByteBufferOutputStream((int) zipEntry.getSize());
|
|
|
|
// write contents to buffer
|
|
buffer.transferFully(zipInputStream);
|
|
|
|
// add memory file
|
|
vfs.add(new MemoryFile(zipEntry.getName(), buffer.getByteBuffer()));
|
|
}
|
|
} finally {
|
|
zipInputStream.close();
|
|
}
|
|
|
|
return vfs;
|
|
}
|
|
}
|