ZipOutputStream の tips

ZipOutputStream はこんな感じで使うんだけど:

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("foo.zip"));
zos.putNextEntry(new ZipEntry(""));
zos.putNextEntry(new ZipEntry("bar.txt"));
FileInputStream fos = new FileInputStream("bar.txt");
byte[] b = new byte[fos.available()];
fis.read(b);
fis.close();
zos.write(b);
zos.close();

やっちゃいけないのは以下の

zos.putNextEntry(new ZipEntry(""));

ルートフォルダをエントリに追加すること。

これをすると、例えばできあがった foo.zip をチェックすると

$ unzip -t foo.zip
Archive:  foo.zip
:  mismatching "local" filename (bar.txt),
         continuing with "central" filename version
    testing:                          OK
    testing: bar                      OK
At least one warning-error was detected in foo.zip.

と警告が出てしまう。

ルート以外のフォルダは追加する必要があるので注意しよう。