有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

提取如何在Java中使用ZipFile类递归打开所有文件,包括文件夹下的文件

我正在用Java创建一个方法来打开zipfile并在zip中动态处理Excel文件。我正在使用Java中的API ZipFile,希望按照内存中的方式处理ZipFile,而不将其解压缩到文件系统中

到目前为止,我能够遍历zip文件,但在zip文件的目录下列出文件时遇到了问题。Excel文件可以放在zip文件的文件夹中。 下面是我当前的代码,在我遇到问题的部分有一条注释。 非常感谢您的帮助:)

public static void main(String[] args) {
    try {
        ZipFile zip = new ZipFile(new File("C:\\sample.zip"));
        for (Enumeration e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) e.nextElement();

            String currentEntry = entry.getName();

            if (entry.isDirectory()) {
                /*I do not know how to get the files underneath the directory
                  so that I can process them */
                InputStream is = zip.getInputStream(entry);
            } else {
                InputStream is = zip.getInputStream(entry);
            }
        }
    } catch (ZipException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

共 (2) 个答案

  1. # 1 楼答案

    Zip条目实际上没有关于文件夹或目录的任何概念,它们都存在于Zip文件的同一个概念根中。允许将文件组织到“文件夹”中的是zip条目的名称

    zip条目之所以被视为目录,是因为它实际上不包含任何压缩字节,并且被标记为压缩字节

    目录条目是一个标记,使您有机会构造使用相同路径前缀的文件需要提取到的路径

    这意味着,您不需要真正关心目录条目,只需预先创建以下任何文件可能需要的输出文件夹

  2. # 2 楼答案

    请看一下herehere

    public static void unzip(final ZipFile zipfile, final File directory)
        throws IOException {
    
        final Enumeration<? extends ZipEntry> entries = zipfile.entries();
        while (entries.hasMoreElements()) {
            final ZipEntry entry = entries.nextElement();
            final File file = file(directory, entry);
            if (entry.isDirectory()) {
                continue;
            }
            final InputStream input = zipfile.getInputStream(entry);
            try {
                // copy bytes from input to file
            } finally {
                input.close();
            }
        }
    }
    
    protected static File file(final File root, final ZipEntry entry)
        throws IOException {
    
        final File file = new File(root, entry.getName());
    
        File parent = file;
        if (!entry.isDirectory()) {
            final String name = entry.getName();
            final int index = name.lastIndexOf('/');
            if (index != -1) {
                parent = new File(root, name.substring(0, index));
            }
        }
        if (parent != null && !parent.isDirectory() && !parent.mkdirs()) {
            throw new IOException(
                "failed to create a directory: " + parent.getPath());
        }
    
        return file;
    }