如何使用Java访问zip文件到zip文件

时间:2015-03-16 11:17:50

标签: java zip

我正在尝试读取位于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文件名。它不认识这条路,所以我不知道我是否清楚。

感谢。

2 个答案:

答案 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());
    }
}
}