バナー画像

ZIPファイルとは

ZIPとは、データ圧縮やアーカイブのフォーマットのことです。

ZIPは主に、Windowsでよく使用されるフォーマットとなっています。

ポテパンダの一言メモ

このZIP形式で圧縮されたファイルをZIPファイルと呼びます。

JavaのZipOutputStreamクラスについて

JavaでZIPファイルを圧縮するには、「ZipOutputStreamクラス」を使います。

ZipOutputStreamクラスは、ファイルをZIPファイル形式で書き込む用の出力ストリーム・フィルタを実装するクラスです。

また、圧縮データと圧縮解除データの両方をサポートします。

JavaでZIPファイルに圧縮する方法

では、Javaで指定フォルダをZIPファイルに圧縮する方法を見ていきましょう。

サンプルコードは下記の通りです。

■記述例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        File zipFile = new File("CompressedFile.zip");
        System.out.println(
            "ZIPファイルに圧縮する前の存在を確認:" + zipFile.exists());
        ZipOutputStream zostr = new ZipOutputStream(
            new FileOutputStream(zipFile));
        File targetFile = new File("Sample");
        Main.compressFile(zostr, targetFile);
        zostr.close();
        System.out.println("ZIPファイルに圧縮した後の存在を確認: " + zipFile.exists());
    }

    public static void compressFile(ZipOutputStream zostr, File file) throws Exception {
        byte[] buf = new byte[1024];
        int len;
        if (file.isDirectory()) {
          zostr.putNextEntry(new ZipEntry(file.getPath() + "/"));
            File[] childFileList = file.listFiles();
            for (File childFile: childFileList) {
                compressFile(zostr, childFile);
            }
        } else {
            zostr.putNextEntry(new ZipEntry(file.getPath()));
            BufferedInputStream bistr = new BufferedInputStream(new FileInputStream(file));
            while ((len = bistr.read(buf, 0, buf.length)) != -1) {
                zostr.write(buf, 0, len);
            }
            bistr.close();
            zostr.closeEntry();
        }
    }
}

また、フォルダ構成は下記の通りです。

JavaでZIPファイルに圧縮する方法 フォルダ構成

Main.javaと同ディレクトリに、ZIPファイルに圧縮したいフォルダ・ファイルを格納します。

圧縮処理を行っているのは compressFile関数です。

ZipOutputStreamクラスの putNextEntryメソッド で、新しいZIPファイル・エントリの書込みを開始し、エントリ・データの開始位置にストリームを配置しています。

圧縮する対象がディレクトリである時は、ディレクトリ名の最後に「/」を追加した値をエントリ名に設定する流れです。

そして、圧縮するファイルの内容を読み込んだ上で、ZipOutputStreamクラスの writeメソッド で、バイト配列を現在のZIPエントリ・データに書き込みます。

すべての内容の書き込みが完了したら、読み込み元のストリームを閉じ、ZipOutputStreamクラスの closeEntryメソッド で現在のZIPエントリを閉じます。

この処理を、ZIPファイルとして圧縮するファイルの数だけ繰り返します。

ポテパンダの一言メモ

上記のプログラムを実行すると、同ディレクトリに CompressedFile.zip が作成でき、ファイル・フォルダの圧縮ができているはずです。

複数ファイルをZIP圧縮するには?

今回の例で言うと、複数のファイルを圧縮する場合は targetFile を追加すればOKです。

こちらもサンプルコードと結果を紹介します。

■記述例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        File zipFile = new File("CompressedFile.zip");
        System.out.println(
            "ZIPファイルに圧縮する前の存在を確認:" + zipFile.exists());
        ZipOutputStream zostr = new ZipOutputStream(
            new FileOutputStream(zipFile));
        File targetFile = new File("Sample01");
        Main.compressFile(zostr, targetFile);
        File targetFile02 = new File("Sample02");
        Main.compressFile(zostr, targetFile02);
        zostr.close();
        System.out.println("ZIPファイルに圧縮した後の存在を確認: " + zipFile.exists());
    }

    public static void compressFile(ZipOutputStream zostr, File file) throws Exception {
        byte[] buf = new byte[1024];
        int len;
        if (file.isDirectory()) {
          zostr.putNextEntry(new ZipEntry(file.getPath() + "/"));
            File[] childFileList = file.listFiles();
            for (File childFile: childFileList) {
                compressFile(zostr, childFile);
            }
        } else {
            zostr.putNextEntry(new ZipEntry(file.getPath()));
            BufferedInputStream bistr = new BufferedInputStream(new FileInputStream(file));
            while ((len = bistr.read(buf, 0, buf.length)) != -1) {
                zostr.write(buf, 0, len);
            }
            bistr.close();
            zostr.closeEntry();
        }
    }
}

■フォルダ構成

複数ファイルをZIP圧縮するフォルダ構成

■実行結果

複数ファイルをZIP圧縮したフォルダ構成

実行結果のように、2つのフォルダ・ファイルが CompressedFile.zip として圧縮できました。

JavaでZIPファイルを解凍する方法

次に、JavaでZIPファイルを解凍する方法を紹介します。

サンプルコードは下記の通りです。

■記述例
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        byte[] buf = new byte[1024];
        int len;

        File zipFile = new File("CompressedFile.zip");
        ZipInputStream zistr = new ZipInputStream(
            new FileInputStream(zipFile));
        ZipEntry zipEntry = null;

        while ((zipEntry = zistr.getNextEntry()) != null) {
            File uncompressFile = new File(zipEntry.getName());

            if (zipEntry.isDirectory()) {
                uncompressFile.mkdirs();
            } else {
                BufferedOutputStream bostr = new BufferedOutputStream(new FileOutputStream(uncompressFile));
                while ((len = zistr.read(buf)) != -1) {
                    bostr.write(buf, 0, len);
                }
                bostr.close();
            }
        }
        zistr.close();
        System.out.println("ZIPファイルの解凍が完了しました");
    }
}

また、フォルダの構成は下記のようになっています。

■フォルダ構成

JavaでZIPファイルを解凍する方法 フォルダ構成

この状態でプログラムを実行すると、下記のように中身のフォルダ・ファイルが解凍されるはずです。

■実行結果

JavaでZIPファイルを解凍した フォルダ構成

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。