我正在尝试在zip文件中找到一个文件并将其作为InputStream
获取。所以这就是我到目前为止所做的事情,我不确定我是否正确地做到了。
这是一个样本,因为原件略长,但这是主要组件......
public InputStream Search_Image(String file_located, ZipInputStream zip)
throws IOException {
for (ZipEntry zip_e = zip.getNextEntry(); zip_e != null ; zip_e = zip.getNextEntry()) {
if (file_located.equals(zip_e.getName())) {
return zip;
}
if (zip_e.isDirectory()) {
Search_Image(file_located, zip);
}
}
return null;
}
现在我面临的主要问题是ZipInputStream
中的Search_Image
与ZipInputStream
的原始组件相同......
if(zip_e.isDirectory()) {
//"zip" is the same as the original I need a change here to find folders again.
Search_Image(file_located, zip);
}
现在提出问题,如何将ZipInputStream
作为新zip_entry
?如果我在我的方法中做了任何错误,请加入,因为我仍缺乏此课程的逻辑。
答案 0 :(得分:6)
如果您还不需要输入流,则应该使用类ZipFile
而不必担心输入流。
ZipFile file = new ZipFile("file.zip");
ZipInputStream zis = searchImage("foo.png", file);
public InputStream searchImage(String name, ZipFile file) {
for (ZipEntry e : Collections.list(file.entries())) {
if (e.getName().endsWith(name)) {
return file.getInputStream(e);
}
}
return null;
}
一些事实:
Search_Image
不正常,searchImage
是)endsWith(name)
来比较您提供的名称,因为该文件可能位于文件夹中,而zip内的文件名始终包含路径答案 1 :(得分:4)
使用ZipInputStream
访问zip条目显然不是这样做的方法,因为您需要迭代条目以找到不是可扩展方法因为性能将取决于您的zip文件中的条目总数。
为了获得最佳效果,您需要使用ZipFile
才能直接访问条目,这要归功于getEntry(name)
方法,无论您的存档大小如何
public InputStream searchImage(String name, ZipFile zipFile) throws IOException {
// Get the entry by its name
ZipEntry entry = zipFile.getEntry(name);
if (entry != null) {
// The entry could be found
return zipFile.getInputStream(entry);
}
// The entry could not be found
return null;
}
请注意,此处提供的名称是图像的相对路径,使用/
作为路径分隔符,因此如果您要访问foo.png
在bar
目录中,预期名称为bar/foo.png
。
答案 2 :(得分:0)
以下是我对此的看法:
ZipFile zipFile = new ZipFile(new File("/path/to/zip/file.zip));
InputStream inputStream = searchWithinZipArchive("findMe.txt", zipFile);
public InputStream searchWithinZipArchive(String name, ZipFile file) throws Exception {
Enumeration<? extends ZipEntry> entries = file.entries();
while(entries.hasMoreElements()){
ZipEntry zipEntry = entries.nextElement();
if(zipEntry.getName().toLowerCase().endsWith(name)){
return file.getInputStream(zipEntry);
}
}
return null;
}