Java ZIP圧縮する方法 ディレクトリ指定やファイル指定 - ZipEntry・ZipOutputStream ホームページ制作 | 墨田区

Java ZIP圧縮する方法 ディレクトリ指定やファイル指定 – ZipEntry・ZipOutputStream

LINEで送る
Pocket

JavaでZipEntryとZipOutputStreamを使ってZIPアーカイブする方法 をご紹介します。

ZipOutputStream クラスは、java.util.zip.ZipOutputStream, org.apache.tools.zip.ZipOutputStream の2種類がありますが、日本語ファイル名を扱える org.apache.tools.zip.ZipOutputStream を利用しましょう。

実務では、ZIP 圧縮したい方法として、「特定のディレクトリを圧縮したい」、もしくは「特定のファイルだけ圧縮したい」などの要望があるかと思います。
今回はその両方を実現するためのサンプルを用意しました。




【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


ソース

それでは、実際のソースを見ながら解説してきます。
今回は、ZipCompressUtils というクラスを用意しました

package com.en.saka.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

/**
 * ZipCompressUtils は、ZIP 圧縮をおこなう上で利便性の高い機能を提供します。
 *
 * @author saka-en.
 * @version $Revision: 1.0 $ $Date: 2013.10.24 $ $Description: 新規作成 $
 */
public class ZipCompressUtils {

    /**
     * 指定されたディレクトリ内のファイルを ZIP アーカイブし、指定されたパスに作成します。
     * デフォルト文字コードは Shift_JIS ですので、日本語ファイル名も対応できます。
     *
     * @param fullPath 圧縮後の出力ファイル名をフルパスで指定 ( 例: C:/sample.zip )
     * @param directory 圧縮するディレクトリ ( 例; C:/sample )
     * @return 処理結果 true:圧縮成功 false:圧縮失敗
     */
    public static boolean compressDirectory( String filePath, String directory ) {
        File baseFile = new File(filePath);
        File file = new File(directory);
        ZipOutputStream outZip = null;
        try {
            // ZIPファイル出力オブジェクト作成
            outZip = new ZipOutputStream(new FileOutputStream(baseFile));
            archive(outZip, baseFile, file);
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        } finally {
            // ZIPエントリクローズ
            if ( outZip != null ) {
                try { outZip.closeEntry(); } catch (Exception e) {}
                try { outZip.flush(); } catch (Exception e) {}
                try { outZip.close(); } catch (Exception e) {}
            }
        }
        return true;
    }

    /**
     * 指定された ArrayList のファイルを ZIP アーカイブし、指定されたパスに作成します。
     * デフォルト文字コードは Shift_JIS ですので、日本語ファイル名も対応できます。
     *
     * @param filePath 圧縮後のファイル名をフルパスで指定 ( 例: C:/sample.zip )
     * @param fileList 圧縮するファイルリスト  ( 例; {C:/sample1.txt, C:/sample2.txt} )
     * @return 処理結果 true:圧縮成功 false:圧縮失敗
     */
    public static boolean compressFileList( String filePath, ArrayList<String> fileList ) {

        ZipOutputStream outZip = null;
        File baseFile = new File(filePath);
        try {
            // ZIPファイル出力オブジェクト作成
            outZip = new ZipOutputStream(new FileOutputStream(baseFile));
            // 圧縮ファイルリストのファイルを連続圧縮
            for ( int i = 0 ; i < fileList.size() ; i++ ) {
                // ファイルオブジェクト作成
                File file = new File((String)fileList.get(i));
                archive(outZip, baseFile, file, file.getName(), "Shift_JIS");
            }
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        } finally {
            // ZIPエントリクローズ
            if ( outZip != null ) {
                try { outZip.closeEntry(); } catch (Exception e) {}
                try { outZip.flush(); } catch (Exception e) {}
                try { outZip.close(); } catch (Exception e) {}
            }
        }
        return true;
    }

    /**
     * ディレクトリ圧縮のための再帰処理
     *
     * @param outZip ZipOutputStream
     * @param baseFile File 保存先ファイル
     * @param file File 圧縮したいファイル
     */
    private static void archive(ZipOutputStream outZip, File baseFile, File targetFile) {
        if ( targetFile.isDirectory() ) {
            File[] files = targetFile.listFiles();
            for (File f : files) {
                if ( f.isDirectory() ) {
                    archive(outZip, baseFile, f);
                } else {
                    if ( !f.getAbsoluteFile().equals(baseFile)  ) {
                        // 圧縮処理
                        archive(outZip, baseFile, f, f.getAbsolutePath().replace(baseFile.getParent(), "").substring(1), "Shift_JIS");
                    }
                }
            }
        }
    }

    /**
     * 圧縮処理
     *
     * @param outZip ZipOutputStream
     * @param baseFile File 保存先ファイル
     * @param targetFile File 圧縮したいファイル
     * @parma entryName 保存ファイル名
     * @param enc 文字コード
     */
    private static boolean archive(ZipOutputStream outZip, File baseFile, File targetFile, String entryName, String enc) {
        // 圧縮レベル設定
        outZip.setLevel(5);

        // 文字コードを指定
        outZip.setEncoding(enc);
        try {

            // ZIPエントリ作成
            outZip.putNextEntry(new ZipEntry(entryName));

            // 圧縮ファイル読み込みストリーム取得
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(targetFile));

            // 圧縮ファイルをZIPファイルに出力
            int readSize = 0;
            byte buffer[] = new byte[1024]; // 読み込みバッファ
            while ((readSize = in.read(buffer, 0, buffer.length)) != -1) {
                outZip.write(buffer, 0, readSize);
            }
            // クローズ処理
            in.close();
            // ZIPエントリクローズ
            outZip.closeEntry();
        } catch ( Exception e ) {
            // ZIP圧縮失敗
            return false;
        }
        return true;
    }
}

compressDirectory メソッド

指定したディレクトリを圧縮したい場合に利用します。

引数説明
filePathStringZIP ファイルの保存先を指定します。( 例: C:/サンプル.zip )
directoryString圧縮したいディレクトリを指定します。 ( 例; C:/samples )

それでは、テストしてみましょう。
今回は、[ C:/samples/サンプルtxt.zip ] というファイル名で、[ C:/samples/txt ] のディレクトリを圧縮してみます。
ZIP Compress 001

以下のテストソースを実行します。

ZipCompressUtils.compressDirectory("C:/samples/サンプルtxt.zip", "C:/samples/txt");

結果は、以下の通りです。
ZIP Compress 002

ZIP Compress 003


compressFileList メソッド

指定したファイルだけを圧縮したい場合に利用します。

引数説明
filePathStringZIP ファイルの保存先を指定します。( 例: C:/サンプル.zip )
fileListArrayList<String>圧縮したいファイルリストを指定します。
( 例; {C:/sample1.txt, C:/sample2.txt} )

それでは、テストしてみましょう。
今回は、[ C:/samples/サンプルtxt.zip ] というファイル名で、[ C:/samples/txt/salmpe1.txt, C:/samples/txt/salmpe3.txt} ] のファイルを圧縮してみます。

以下のテストソースを実行します。

ArrayList<String> fileList = new ArrayList<String>();
fileList.add("C:/samples/txt/salmpe1.txt");
fileList.add("C:/samples/txt/salmpe3.txt");
ZipCompressUtils.compressFileList("C:/samples/サンプルtxt.zip", fileList);

結果は、以下の通りです。
ZIP Compress 004

ZIP Compress 005


ZIP 解凍

ZIP 解凍については、こちら をご覧ください。


おつかれさまでした。

LINEで送る
Pocket

この記事がお役に立ちましたら シェア をお願いいたします。

Javaの勉強が思うように進まないときは!

Javaの勉強が思うように進まないのであれば、プロに直接質問ができる プログラミングスクール を検討してみてはいかがでしょうか?プログラミングスクールに申し込めば、短期間で一定のスキルを身に着けることができます!

Javaコースあり!オンライン完結型 テックアカデミー TechAcademy [テックアカデミー]

どこかに通う必要なく、自宅でプログラミングやアプリ開発を学ぶことができるのが特徴のスクールです。未経験からプロになるまで最短4週間という、超短期集中型の学習ができます。年齢層は10代〜40代の男女が中心で、学引があり多くの学生が受講しているそうですよ。オンラインで受講ができるスクールですので、全国どこからでも学習ができますね。

更にさらに、パーソナルメンターにチャット質問できちゃうんです!!

これは素晴らしいことですよ!ハマったり困ったことが起こるのがプログラミングの世界。知っている誰かに聞けば数分で解決することが、自分だけだと何時間もかかったりしますから!いや、これホントですよ。

しかし、便利な世の中になりましたよねー。一昔前ではオンラインで学習できるなんて、思いもよりませんでしたから。講師もバリバリのエンジニアですので、現場で使えるスキルを教えてもらえます。なんとも素晴らしいスクールがあったものですね。学割を使えば社会人より半額以下で受講できますから、学生さんには超おすすめです。

これから Java プログラミングを勉強して、将来はプログラマーとして活躍したいと思っている方には、就職保証付きJavaエンジニアコース というのがおすすめです。就職先まで保証してくれるとなれば、もう安心して学習に専念できますね。夢への第一歩はここから始まるのかも。あ、将来はライバルですね^^

オンラインスクールですから営業エリアは全国です。
気になる方は一度チェックしてみてください。無料の動画説明会も常時開催していますよ。


Javaコースあり!未経験者にウケてる KENスクール パソコンスクール・パソコン教室 【KENスクール】個別指導のWeb-DTP・OA・IT PCスクール

理解度や学習ペースに合わせて、一人ひとりが納得して前進できる授業を提供してくれるのが特徴です。特に課題製作は現場さながらで、実務に即したものとなっていますので短期でのスキルアップが望めます。自宅学習のサポートも充実していて、授業内容をいつでもビデオで振り返ることができるのもうれしいですね。好きな時間に好きな場所で、無理なくスケジューリングできるので、仕事の忙しい方でも柔軟に学ぶことができますよ。

更にさらに、なんと 就職サポート をしてくれるというのですから驚きです!!

履歴書の書き方から面接指導、求人の紹介など、具体的な就職先まで提案してくれるんです!私も「もっと早く出会いたかったなぁー、こんなスクール」・・・って思っちゃいました^^

東京・神奈川・愛知・大阪を営業エリアとされています。
まずは気軽に 無料体験予約 に申し込んでみるのもアリですよ。


コメント - Thank you for the comment.

  1. 何月何日に作成された記事でしょうか?

    2015/05/21 15:33

     

    何月何日に作成された記事でしょうか?
    javaのversion等書いて頂けると助かります。

    返信

     
    •  

      コメントありがとうございます。この記事を書いたのは2013年ですから、2年程前ですかね。Javaのバージョンですが、1.5~1.7まで動作することは確認しています。

      返信

       

コメントを残す

お名前 (必須)
メールアドレス
(アドレスは公開されません)

コメント(必須)

Trackback URL