我正在尝试读取位于zip文件中的zip文件中的.srt文件。我成功地阅读了一个简单的zip文件中的.srt文件,其中包含以下代码摘录:
for (Enumeration enume = fis.entries(); enume.hasMoreElements();) {
ZipEntry entry = (ZipEntry) enume.nextElement();
fileName = entry.toString().substring(0,entry.toString().length()-4);
try {
InputStream in = fis.getInputStream(entry);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String ext = entry.toString().substring(entry.toString().length()-4, entry.toString().length());
但现在我不知道怎么能到zip文件里面的zip文件。 我尝试使用ZipFile fis = new ZipFile(filePath),filePath是zip文件的路径+里面的zip文件名。它不认识这条路,所以我不知道我是否清楚。
感谢。
答案 0 :(得分:4)
ZipFile
仅适用于真实文件,因为它旨在用作随机访问机制,需要能够直接查找文件中的特定位置以按名称读取条目。但是正如VGR在评论中建议的那样,当你无法随机访问zip-inside-a-zip时,你可以使用ZipInputStream
,这提供了严格按顺序访问条目,并使用任何InputStream
zip格式数据。
但是,与其他流相比,ZipInputStream
的使用模式略显奇怪 - 调用getNextEntry
读取条目元数据并定位流以读取该条目的数据,您从ZipInputStream
读取直到它报告EOF,然后您(可选)调用closeEntry()
,然后再转到流中的下一个条目。
关键点在于 close()
ZipInputStream
,直到您完成阅读最终条目为止,因此根据您要对条目数据执行的操作,您必须 try(ZipInputStream outerZip = new ZipInputStream(fis)) {
ZipEntry outerEntry = null;
while((outerEntry = outerZip.getNextEntry()) != null) {
if(outerEntry.getName().endsWith(".zip")) {
try(ZipInputStream innerZip = new ZipInputStream(
new CloseShieldInputStream(outerZip))) {
ZipEntry innerEntry = null;
while((innerEntry = innerZip.getNextEntry()) != null) {
if(innerEntry.getName().endsWith(".srt")) {
// read the data from the innerZip stream
}
}
}
}
}
}
可能需要使用commons-io CloseShieldInputStream
之类的东西来防止流过早关闭。
{{1}}
答案 1 :(得分:1)
找到递归提取.zip文件的代码:
public void extractFolder(String zipFile) throws ZipException, IOException {
System.out.println(zipFile);
int BUFFER = 2048;
File file = new File(zipFile);
ZipFile zip = new ZipFile(file);
String newPath = zipFile.substring(0, zipFile.length() - 4);
new File(newPath).mkdir();
Enumeration zipFileEntries = zip.entries();
// Process each entry
while (zipFileEntries.hasMoreElements())
{
// grab a zip file entry
ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
String currentEntry = entry.getName();
File destFile = new File(newPath, currentEntry);
//destFile = new File(newPath, destFile.getName());
File destinationParent = destFile.getParentFile();
// create the parent directory structure if needed
destinationParent.mkdirs();
if (!entry.isDirectory())
{
BufferedInputStream is = new BufferedInputStream(zip
.getInputStream(entry));
int currentByte;
// establish buffer for writing file
byte data[] = new byte[BUFFER];
// write the current file to disk
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream dest = new BufferedOutputStream(fos,
BUFFER);
// read and write until last byte is encountered
while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
is.close();
}
if (currentEntry.endsWith(".zip"))
{
// found a zip file, try to open
extractFolder(destFile.getAbsolutePath());
}
}
}