【Java】ZIP圧縮・解凍を徹底解説!階層構造・パスワード付ZIPにも対応

当ページのリンクには広告が含まれています。

JavaでZIPファイルを扱う方法を、初心者にもわかりやすく解説します。

標準ライブラリであるjava.util.zipを使った基本的な使い方から、階層構造の作成、パスワード付きの圧縮・解凍まで、具体的なコード例を交えて詳しく説明します。さらに、より高度な機能や使いやすさを提供するサードパーティ製のライブラリについても紹介します。

※バージョンはJava8で解説しています。

目次

はじめに

なぜZIP圧縮・解凍が重要なのか?

現代のデジタル世界では、データ量が爆発的に増加しています。画像、動画、テキストなど、様々な形式のデータが日々生成され、保存、転送されています。この膨大なデータを効率的に扱うためには、圧縮 が不可欠です。ZIP圧縮は、データのサイズを縮小することで、ストレージ容量の節約ネットワーク帯域の削減データ転送時間の短縮に貢献します。

また、複数のファイルを一つのファイルにまとめるアーカイブ機能も、ZIP形式が広く利用されている理由の一つです。これにより、複数のファイルをまとめて管理したり、バックアップしたりすることが容易になります。

JavaでZIPファイルを扱うメリット

  • 豊富なライブラリ: Javaには、標準のjava.util.zipパッケージをはじめ、Apache Commons Compressなど、強力なZIP処理ライブラリが数多く存在します。
  • プラットフォームの独立性: Javaで開発されたZIP処理プログラムは、Windows、macOS、Linuxなど、様々なプラットフォームで実行できます。
  • オブジェクト指向: Javaのオブジェクト指向の特性を生かして、ZIPファイルの操作を直感的に行うことができます。

本記事で扱う内容

本記事では、JavaでZIPファイルを扱う方法を、初心者にもわかりやすく解説します。具体的には、以下の内容を扱います。

  • Java.util.zipパッケージを使った基本的なZIP圧縮・解凍: 標準のライブラリを使ったシンプルな例から、階層構造の作成まで、段階的に解説します。
  • サードパーティ製ライブラリの紹介: より高度な機能や柔軟性を求める場合に便利なライブラリの使い方を説明します。
  • パスワード付きのZIP圧縮・解凍: セキュリティが求められる場合に重要な、パスワードを設定したZIPファイルの操作方法について解説します。

これらの内容を通じて、あなたがJavaでZIPファイルの基本的な操作を身に着けることを目指します

java.util.zipパッケージの基本

圧縮

Javaの標準ライブラリであるjava.util.zipパッケージには、ZIPファイルの操作に必要なクラスが数多く含まれています。その中でも、ZipOutputStreamクラスは、新しいZIPファイルを作成し、そこにデータを書き込むためのクラスです。

コード例

解凍

ZipInputStreamクラスは、既存のZIPファイルからデータを抽出するためのクラスです。

コード例

補足
  • 上記のコード例は簡略化されており、エラー処理や例外処理は省略されています。実際の開発では、適切なエラー処理を行う必要があります。
  • ZipEntryには、圧縮方法やタイムスタンプなどの様々な情報が含まれています。これらの情報を利用することで、より柔軟なZIPファイルの操作が可能になります。

java.util.zipで階層構造のZIPを作成

エンジニア, パソコン, ノマド

ディレクトリ構造を作るには?

ZipEntryクラスのnameプロパティで階層構造になっているファイルのパスとディレクトリ階層を定義します。

ディレクトリとファイルパスの全てを定義しなければならないことと、ディレクトリ階層自体はwriteメソッドで書き出す必要が無いという点に注意してください。

コード例

以下のような形で出力されます。

しかし、なかなか実装が面倒なので、次で階層構造を簡単に圧縮・解凍できるライブラリを紹介します。

階層構造の圧縮・解凍にお薦めのライブラリ

ZT Zip

階層構造化が簡単にできるものとしてzt-zipがあります。ほぼ1行で階層構造の圧縮・解凍ができます

準備

依存関係を追加します。

ログの実装が必要なのでlogback藻一緒に追加します。

圧縮

圧縮したいルートディレクトリと保存先名を指定するだけで圧縮ができます。(実質1行)

解凍

解凍するZIPファイルと解凍先ディレクトリを指定するだけで簡単に解凍できます。(こちらも実質1行)

注意点

logbackがJavaのバージョンに依存しているので、若干古い1.3系を使っています。執筆時点では1.5系があるのですが、Java8よりも上のバージョンのため使えません。

こういった依存関係があるので、ご自身のプロジェクトで使用できるかどうかはよくご確認の上、利用を検討してください。

Apache Commons Compress

Apache Commons Compressは、Apacheソフトウェア財団が提供する、Javaで圧縮・解凍処理を行うための強力なライブラリです。ZIP、TAR、GZIP、BZIP2など、様々な圧縮形式に対応しており、Java標準のjava.util.zipパッケージよりも多くの機能と柔軟性を提供します。

ZT-zipのバージョン依存の問題がJava8では特に発生しなかったので、Java8で最新のライブラリを使いたいという場合はこちらの選択肢になるかと思います。

Apache Commons Compressのメリット

  • 豊富な圧縮形式に対応: ZIP、TAR、GZIP、BZIP2など、幅広い圧縮形式をサポートしている。
  • 使いやすさ: 直感的なAPIで、簡単に圧縮・解凍処理を実装できる。
    • 階層構造に関してはZT-zipには劣りますが、再帰処理を使うことで実装できるのでそれほど難しくはありません。

基本的な使い方

階層構造のあるアーカイバをZIP圧縮するコード例です。

ディレクトリのルートを指定すると再帰的にすべてのディレクトリとファイルを圧縮できます。

パスワード付き圧縮・解凍のお薦めライブラリ

zip4j

java.util.zip Zt zipApache Commons CompressではパスワードZIPはサポートされていません。そのため、別のライブラリを検討する必要があります。

パスワード付ZIPとして、おそらく最もよく使われているのがzip4jです。

コード例

依存関係の追加

圧縮

注意点

階層構造を直接サポートするAPIは用意されていないので、対象になるファイルを個別に指定する必要があります。

解凍

解凍時は階層構造を意識する必要はありません。

まとめ

  • 圧縮・解凍には、java.util.zip, zt-zip, Apache common Compresse, zip4jという選択肢がある。
  • 各々をまとめると以下の通り。
ライブラリ階層構造パスワード付
java.util.zip
zt-zip
Apache common Compresse
zip4j

参考資料

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰。
現在はフリーランスエンジニア兼コアファクトリ合同会社代表。
得意な言語はJava。

新人教育経験あり(わからなくて進まない子を放置しない方針)
Javaの新人教育にお困りでしたらお声がけください。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次