Zipファイルの作成方法

備忘録を兼ねて、JavaでZIPファイルを作成する場合の方法をメモ。ただし、この方法だと圧縮後のサイズが未設定なので、展開出来ないツールがあるので注意が必要。

public class ZipFileUtils {

    /**
     * 指定された対象ファイルを基に、Zipファイルを作成する。
     * 
     * @param targetPath
     *            Zipファイルを作成するディレクトリのパス
     * @param zipFileName
     *            Zipファイル名
     * @param files
     *            対象ファイル
     * @return Zipファイル
     */
    public static File create(final String targetPath,
            final String zipFileName, final File[] files) throws IOException {

        ZipOutputStream out = null;

        File distDir = new File(targetPath);
        File distFile = new File(distDir, zipFileName);

        try {
            out = new ZipOutputStream(new FileOutputStream(distFile));
            for (File file : files) {
                addEntry(out, file);
            }

        } finally {
            IOUtils.closeQuietly(out);
        }

        return distFile;
    }

    // ------------------------------------------------------ [Private Methods]

    /**
     * 指定されたファイルをZipファイルにエントリーする。
     * 
     * @param out
     *            Zipファイル用アウトプットストリーム
     * @param entryFile
     *            Zipファイルに格納するファイル
     * @throws IOException
     *             ファイルが存在しない場合
     */
    private static void addEntry(ZipOutputStream out, File entryFile)
            throws IOException {

        ZipEntry zipEntry = new ZipEntry(entryFile.getPath());
        out.putNextEntry(zipEntry);

        InputStream in = null;
        try {
            in = new BufferedInputStream(new FileInputStream(entryFile));
            byte[] buf = new byte[1024];
            int count = 0;
            while ((count = in.read(buf, 0, 1024)) != -1) {
                out.write(buf, 0, count);
            }

        } finally {
            IOUtils.closeQuietly(in);
            out.closeEntry();
        }
    }
}

微妙にcommons-ioを使っとります。CRCを使って圧縮後のサイズを設定する方法もあるけど、それはまた今度。