Javaでファイルを圧縮する方法!DeflaterOutputStreamの使い方を徹底解説
Javaでファイルを圧縮するには?
Javaでは、java.util.zipパッケージに含まれるDeflaterOutputStreamクラスを使用することで、データを圧縮しながら出力先へ書き出すことができます。このクラスは、DEFLATE圧縮アルゴリズム(ZIPやGZIPでも使われる標準的な方式)に基づいており、画像やテキストなど任意のファイルを手軽に圧縮できます。
このクラスのwrite()メソッドは、int型またはbyte型のデータを受け取り、圧縮したうえで、現在のDeflaterOutputStreamオブジェクトに紐づいた出力先へ書き込みます。
ファイル圧縮の基本手順
- 圧縮したいファイルのパスを文字列としてコンストラクタに渡し、FileInputStreamオブジェクトを生成します。
- 出力先ファイルのパスを文字列としてコンストラクタに渡し、FileOutputStreamオブジェクトを生成します。
- 上記で作成したFileOutputStreamオブジェクトを引数として渡し、DeflaterOutputStreamオブジェクトを生成します。
- 入力ファイルの内容を読み込みながら、DeflaterOutputStreamクラスのwrite()メソッドで順次書き込みます。
- 処理が完了したら、close()メソッドでストリームを閉じ、圧縮データを確定させます。
サンプルコード
以下は、画像ファイル「logo.jpg」を読み込み、「compressedLogo.txt」として圧縮保存する例です。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.DeflaterOutputStream;
public class CompressingFiles {
public static void main(String args[]) throws IOException {
// FileInputStreamのインスタンス化
String inputPath = "D:\\ExampleDirectory\\logo.jpg";
FileInputStream inputStream = new FileInputStream(inputPath);
// FileOutputStreamのインスタンス化
String outputPath = "D:\\ExampleDirectory\\compressedLogo.txt";
FileOutputStream outputStream = new FileOutputStream(outputPath);
// DeflaterOutputStreamのインスタンス化
DeflaterOutputStream compresser = new DeflaterOutputStream(outputStream);
int contents;
while ((contents = inputStream.read()) != -1) {
compresser.write(contents);
}
compresser.close();
System.out.println("ファイルが圧縮されました......");
}
}
実行結果
ファイルが圧縮されました......
補足:try-with-resourcesでより安全に書く
Java 7以降では、try-with-resources構文を使うと、ブロックを抜けたときにストリームが自動的にクローズされるため、クローズ忘れによるリソースリークを防げます。実務では以下のように記述するのが推奨されます。
try (FileInputStream in = new FileInputStream(inputPath);
DeflaterOutputStream out = new DeflaterOutputStream(new FileOutputStream(outputPath))) {
int data;
while ((data = in.read()) != -1) {
out.write(data);
}
}
その他の圧縮方式との使い分け
DeflaterOutputStream以外にも、用途に応じて以下のクラスが利用できます。
- GZIPOutputStream:GZIP形式(.gz)で圧縮したい場合に使用します。
- ZipOutputStream:複数ファイルを1つのZIPアーカイブにまとめたい場合に使用します。
なお、圧縮されたファイルはそのままでは開けないため、復元する際は対応するInflaterInputStreamなどのクラスで展開してください。
-
【Java】JSONオブジェクトをファイルに書き込む方法(json-simpleライブラリの使い方)
JSON(JavaScript Object Notation)は、現在もっとも広く使われているデータ交換フォーマットのひとつです。軽量であることと、特定のプログラミング言語に依存しないことが大きな特徴で、異なるシステム間でのデータやり取りに最適です。 JavaでJSONファイルを読み書きするには、json-simple ライブラリが便利です。json-simpleは軽量なJSON処理ライブラリで、JSONテキストのエンコード(書き込み)とデコード(読み込み)の両方に対応しており、JSON仕様(RFC4627)に完全準拠しています。 ライブラリの準備 json-simpleを使用するには、まず
-
Androidで動画を圧縮する方法!おすすめアプリ2選と画質を保つコツ
スマホから1時間分の動画を誰かに送ろうとすると、ファイルサイズによっては送信に数時間かかることもあります。時間がかかるだけでなく、通信量も大量に消費してしまうのが悩みどころです。しかし、Androidスマホなら動画圧縮アプリを使うことで、こうした動画を簡単に圧縮できます。この記事では、おすすめの2つの圧縮アプリの使い方を詳しくご紹介します。 動画圧縮とは?その仕組みを解説 動画圧縮とは、元のファイルよりも少ない容量になるよう動画ファイルをエンコードすることです。元の動画から、ピクセル・音声・シーンなどの反復的で冗長な要素を取り除くことで実現されます。 動画圧縮ソフトを使用すると、フレーム内の