4

Javaでzipファイルを開き、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();
    }
}
4

2 に答える 2

4

zip エントリには、実際にはフォルダーやディレクトリに関する概念はありません。それらはすべて、zip ファイル内の同じ概念上のルート内に存在します。ファイルを「フォルダ」に整理できるようにするのは、zip エントリの名前です。

zip エントリがディレクトリと見なされるのは、実際には圧縮されたバイトが含まれておらず、そのようにフラグが付けられているためです。

ディレクトリ エントリは、同じパス プレフィックスを使用するファイルを抽出する必要があるパスを作成する機会を与えるためのマークです。

これは、ディレクトリ エントリを実際に気にする必要がないことを意味します。それ以外の場合は、後続のファイルが必要とする可能性のある出力フォルダーを事前に作成します。

于 2013-09-10T04:46:36.713 に答える
3

こちらこちらをご覧ください

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;
}
于 2013-09-10T04:41:59.427 に答える