tohokuaikiのチラシの裏

技術的ネタとか。

JavaでZIPファイルの一覧を取得しようとしたら日本語ファイル名が文字化けしたので悩んだ件

原因

java.util.zip.ZipFileは、ZIPファイルのファイル名がUTF-8であるとして処理される。

そこで、
Javaのマニアじゃない入門の「ZipFileクラスを使う」を使ったら日本語がダメになってしまった。*1

対策

java.util.zip.ZipFileではなく、org.apache.tools.zip.ZipFileを使う。
このClassはjava.util.zip.ZipFileとほぼ似てるので入れ替えが楽である。

元記事のコードを2か所だけ変更。

    public void list( File aZipFile ){
        //-------------------------------
        // ZIPファイルを読み込む
        //-------------------------------
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile( aZipFile, "Windows-31j");
        } catch (ZipException e) {
            // ZIP形式ではないファイルだった
            e.printStackTrace();
            return;
        } catch (IOException e) {
            // ファイルオープンエラー
            e.printStackTrace();
            return;
        }
        
        //-------------------------------
        // zipファイル内の 一覧を取得する
        //-------------------------------
        Enumeration enumeration = zipFile.getEntries();
        while( enumeration.hasMoreElements() ){
            ZipEntry entry = ( ZipEntry )enumeration.nextElement();

            // このエントリを表示する
            String name  = entry.getName();
            long   bytes = entry.getSize();
            System.out.println( name + ", " + bytes );
        }
    }

*1:もう一つの「展開の時と同じくZipInputStreamを使う」の方はエラー出てそもそもダメだった。