Java:ZipFileでjava.lang.IllegalArgumentException: MALFORMED

以下のようなエラーが発生することがある。

Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED
    at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
    at java.util.zip.ZipFile.getZipEntry(ZipFile.java:566)
    at java.util.zip.ZipFile.access$900(ZipFile.java:60)
    at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:524)
    at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:499)
    at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:480)
    at java.util.jar.JarFile$JarEntryIterator.next(JarFile.java:257)
    at java.util.jar.JarFile$JarEntryIterator.nextElement(JarFile.java:266)
    at java.util.jar.JarFile$JarEntryIterator.nextElement(JarFile.java:247)
    at Main.main(Main.java:13)

単純にjava.util.zip.ZipCoder.toString(ZipCoder.java:58)のコードを見ればわかるのだが、Zipファイル(あるいはjar、War)に格納されたファイルの名称がUTF-8になっていないからである。深く追求していないが、日本語名称のファイルをWindows上でZIPにすると、MS932(シフトJIS)になってしまうようだ。

このために、UTF-8にしか対応していないZIPFileでエラーが発生してしまう。単純に日本語ファイル名をやめればよい。日本語ファイル名のままにしたい場合は、以下の方策が必要かもしれない(これも追求していない)。

  • Zipファイル作成時にUTF-8で格納されるようにする。あるいはZipファイルを修正してUTF-8にする。
  • java.util.zip.ZipCoderのコードを修正しUTF-8以外にも対応できるようにする。