我可以通过ZipInputStream
,但在开始迭代之前,我想获得迭代期间需要的特定文件。我怎样才能做到这一点?
ZipInputStream zin = new ZipInputStream(myInputStream)
while ((entry = zin.getNextEntry()) != null)
{
println entry.getName()
}
我可以通过ZipInputStream
,但在开始迭代之前,我想获得迭代期间需要的特定文件。我怎样才能做到这一点?
ZipInputStream zin = new ZipInputStream(myInputStream)
while ((entry = zin.getNextEntry()) != null)
{
println entry.getName()
}
使用 ZipEntry 上的 getName() 方法来获取您想要的文件。
ZipInputStream zin = new ZipInputStream(myInputStream)
String myFile = "foo.txt";
while ((entry = zin.getNextEntry()) != null)
{
if (entry.getName().equals(myFileName)) {
// process your file
// stop looking for your file - you've already found it
break;
}
}
从 Java 7 开始,如果你只想要一个文件并且有一个文件要读取,最好使用 ZipFile 而不是 ZipStream:
ZipFile zfile = new ZipFile(aFile);
String myFile = "foo.txt";
ZipEntry entry = zfile.getEntry(myFile);
if (entry) {
// process your file
}
如果myInputStream
您正在使用的文件来自磁盘上的真实文件,那么您可以简单地使用java.util.zip.ZipFile
它,它由 a 支持RandomAccessFile
并提供按名称对 zip 条目的直接访问。但是,如果您只有一个InputStream
(例如,如果您在从网络套接字或类似设备接收时直接处理流),那么您将不得不自己进行缓冲。
您可以将流复制到一个临时文件,然后使用 打开该文件ZipFile
,或者如果您事先知道数据的最大大小(例如,对于预先声明其的 HTTP 请求Content-Length
),您可以使用 aBufferedInputStream
将其缓冲在内存中,直到您已找到所需的条目。
BufferedInputStream bufIn = new BufferedInputStream(myInputStream);
bufIn.mark(contentLength);
ZipInputStream zipIn = new ZipInputStream(bufIn);
boolean foundSpecial = false;
while ((entry = zin.getNextEntry()) != null) {
if("special.txt".equals(entry.getName())) {
// do whatever you need with the special entry
foundSpecial = true;
break;
}
}
if(foundSpecial) {
// rewind
bufIn.reset();
zipIn = new ZipInputStream(bufIn);
// ....
}
(我自己没有测试过这段代码,你可能会发现有必要CloseShieldInputStream
在 thebufIn
和 first之间使用 commons-io 之类的东西zipIn
,以允许第一个 zip 流在不关闭底层的情况下关闭,bufIn
然后再重新上绕它)。
ZipFile file = new ZipFile("file.zip");
ZipInputStream zis = searchImage("foo.png", file);
public searchImage(String name, ZipFile file)
{
for (ZipEntry e : file.entries){
if (e.getName().endsWith(name)){
return file.getInputStream(e);
}
}
return null;
}