Java でファイルが1つだけ圧縮された zip を解凍するサンプル

公開日: : 最終更新日:2014/05/05 Java ,

ファイルが1つだけ圧縮された zip を解凍するサンプルです。

単一ファイルが圧縮された zip という制限が付くので、あまり汎用的ではないのですが業務アプリを作るときに意外と必要になるのでメモしておきます。

icatch-zip_524574337_mini

photo credit: TruShu via photopin cc

目次

1. 動作環境

1-1. Java

サンプルを作成したマシンにインストールしてある Java のバージョンは次の通りです。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

2. zip 解凍のサンプルコード

zip を解凍するメソッドのインタフェースは定義は次の通りです。

/**
 * ファイルが1つだけ圧縮された zip ファイルを解凍する。
 * 
 * 引数の Stream はこのメソッドでそれぞれ BufferedXXXStream に包むので、呼び出し側で包まなくてよい。
 * 
 * @param inputStream
 *            zip ファイルの InputStream
 * @param outputStream
 *            解凍先の OutputStream
 * @throws IOException
 *             解凍処理で例外が発生した場合
 */
public static void uncompressSingleFile(InputStream inputStream,
        OutputStream outputStream) throws IOException;

解凍する zip の InputStream と解凍先の OutputStream を受け取ります。
Stream のバッファリングはこのメソッド内で行うので、バッファリングしていない素の Stream を渡してもらいます。

次はコード全体になります。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipInputStream;

public class Zip {

    /**
     * InputStream から一度に読み込むバイトサイズ。
     */
    private static final int BYTE_SIZE = 32768;

    /**
     * ファイルが1つだけ圧縮された zip ファイルを解凍する。
     * 
     * 引数の Stream はこのメソッドでそれぞれ BufferedXXXStream に包むので、呼び出し側で包まなくてよい。
     * 
     * @param inputStream
     *            zip ファイルの InputStream
     * @param outputStream
     *            解凍先の OutputStream
     * @throws IOException
     *             解凍処理で例外が発生した場合
     */
    public static void uncompressSingleFile(InputStream inputStream,
            OutputStream outputStream) throws IOException {
        ZipInputStream in = new ZipInputStream(new BufferedInputStream(
                inputStream));
        BufferedOutputStream out = new BufferedOutputStream(outputStream);

        try {
            if (in.getNextEntry() == null) {
                throw new IllegalArgumentException("empty file.");
            }

            byte[] buf = new byte[BYTE_SIZE];
            int size = 0;
            while ((size = in.read(buf, 0, buf.length)) != -1) {
                out.write(buf, 0, size);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

InputStream から一度に読み込むバイトサイズを定数 BYTE_SIZE として定義しています。
このサイズを大きくすればより高速に zip の解凍処理が終了します。

3. まとめ

zip を解凍してみたけれど空っぽだった場合には IllegalArgumentExceptionthrow するようになっています。

これって実行時例外なのでボクは JavaDoc には書かないのですが、一般的にはどうなんでしょうかね。

4. その他の Java に関する記事

Java に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

medium_182531101

ClassLoader を使って getResourceAsStream で取得したファイルを UTF-8 で読み込む

よく使う割には覚えられず毎回調べている気がするので備忘録としてメモしておきます。 文字コードを指定し

記事を読む

no image

画像ファイルを選別するFilenameFilter

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメ

記事を読む

no image

Jetty でシンプルなプロジェクトを作成してみた

プロトタイプを作成するなら Tomcat よりも Jetty のほうがさらっと出来そうだなぁ、と今さ

記事を読む

medium_2055608272

指定した年月の日付を Calendar オブジェクトの一覧で取得する

小ワザです。 業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

icatch-3361b5e1-resized

Optional型の変数にget()とifPresent()は使わない

Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに O

記事を読む

no image

Functions#compose() を使って Function を合成するサンプル(Java8 との比較付き)

Java8 と GoogleGuava の Function について コードの違いを書いた。 その

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


× 4 = 三十 二

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑