Java
 Computer >> コンピューター >  >> プログラミング >> Java

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などのクラスで展開してください。

  1. 【Java】JSONオブジェクトをファイルに書き込む方法(json-simpleライブラリの使い方)

    JSON(JavaScript Object Notation)は、現在もっとも広く使われているデータ交換フォーマットのひとつです。軽量であることと、特定のプログラミング言語に依存しないことが大きな特徴で、異なるシステム間でのデータやり取りに最適です。 JavaでJSONファイルを読み書きするには、json-simple ライブラリが便利です。json-simpleは軽量なJSON処理ライブラリで、JSONテキストのエンコード(書き込み)とデコード(読み込み)の両方に対応しており、JSON仕様(RFC4627)に完全準拠しています。 ライブラリの準備 json-simpleを使用するには、まず

  2. Androidで動画を圧縮する方法!おすすめアプリ2選と画質を保つコツ

    スマホから1時間分の動画を誰かに送ろうとすると、ファイルサイズによっては送信に数時間かかることもあります。時間がかかるだけでなく、通信量も大量に消費してしまうのが悩みどころです。しかし、Androidスマホなら動画圧縮アプリを使うことで、こうした動画を簡単に圧縮できます。この記事では、おすすめの2つの圧縮アプリの使い方を詳しくご紹介します。 動画圧縮とは?その仕組みを解説 動画圧縮とは、元のファイルよりも少ない容量になるよう動画ファイルをエンコードすることです。元の動画から、ピクセル・音声・シーンなどの反復的で冗長な要素を取り除くことで実現されます。 動画圧縮ソフトを使用すると、フレーム内の