カテゴリ: Java 更新日: 2026/01/03

JavaのBufferedOutputStreamクラスの使い方を完全ガイド!初心者でもわかる効率的なファイル書き込み

BufferedOutputStream
BufferedOutputStream

先生と生徒の会話形式で理解しよう

生徒

「Javaでファイルにデータを書き込むときに、効率的に処理する方法ってありますか?」

先生

「ありますよ。BufferedOutputStreamクラスを使うと効率的にファイル書き込みができます。このクラスはバッファリングという仕組みを利用して速度を向上させます。」

生徒

「バッファリングって何ですか?」

先生

「バッファリングとは、一度にある程度のデータをまとめて処理することで、ファイル操作の回数を減らし、パフォーマンスを向上させる仕組みです。具体的な使い方を見ていきましょう!」

1. BufferedOutputStreamとは?

1. BufferedOutputStreamとは?
1. BufferedOutputStreamとは?

JavaのBufferedOutputStreamクラスは、java.ioパッケージに含まれるクラスで、ファイルやストリームにデータを書き込む際の効率を向上させるために使用されます。

このクラスを使用すると、データを書き込む前に一時的にメモリ内のバッファにデータを蓄えます。そして、一定量がたまったときにまとめてストリームに書き出します。これにより、ディスクやネットワークへのアクセス回数が減り、処理が高速化します。

2. BufferedOutputStreamの基本的な使い方

2. BufferedOutputStreamの基本的な使い方
2. BufferedOutputStreamの基本的な使い方

以下に、BufferedOutputStreamを使った基本的なファイル書き込みの例を示します。


import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamExample {
    public static void main(String[] args) {
        String data = "Hello, BufferedOutputStream!";
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
            bos.write(data.getBytes()); // データをバッファに書き込み
            bos.flush(); // 必要に応じてバッファをフラッシュ
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果:


ファイル output.txt に "Hello, BufferedOutputStream!" が書き込まれます

上記の例では、FileOutputStreamをラップしてBufferedOutputStreamを使用しています。flush()メソッドは、バッファ内のデータを強制的にストリームに書き出すためのものです。

3. BufferedOutputStreamを使う際のポイント

3. BufferedOutputStreamを使う際のポイント
3. BufferedOutputStreamを使う際のポイント
  • **バッファサイズの指定**:デフォルトでは8KBのバッファが使用されますが、コンストラクタでカスタムサイズを指定できます。
  • **例外処理**:ストリーム操作中にIOExceptionが発生する可能性があるため、適切な例外処理を行いましょう。
  • **flushの活用**:重要なデータが失われないように、必要に応じてflush()を呼び出してください。

try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("customBuffer.txt"), 16384)) {
    String data = "This is a custom buffer size example.";
    bos.write(data.getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

この例では、16KBのカスタムバッファを使用しています。バッファサイズは、書き込むデータ量やアプリケーションの特性に応じて調整すると良いでしょう。

4. BufferedOutputStreamと他のクラスとの違い

4. BufferedOutputStreamと他のクラスとの違い
4. BufferedOutputStreamと他のクラスとの違い

BufferedOutputStreamは以下のようなクラスと比較されることがよくあります:

  • OutputStream:基本的な出力ストリームで、バッファリングの仕組みはありません。
  • BufferedWriter:文字データを効率的に書き込むためのクラス。テキストデータに特化しています。
  • DataOutputStream:プリミティブ型データを直接書き込むためのクラス。

例えば、文字列を効率的に書き込みたい場合はBufferedWriterを使うこともできます。


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("example.txt"))) {
            bw.write("This is a BufferedWriter example.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果:


ファイル example.txt に "This is a BufferedWriter example." が書き込まれます

このように、用途に応じてクラスを使い分けることで、より効率的でわかりやすいコードを書くことができます。

5. BufferedOutputStreamで画像やバイナリデータを書き込む

5. BufferedOutputStreamで画像やバイナリデータを書き込む
5. BufferedOutputStreamで画像やバイナリデータを書き込む

BufferedOutputStreamはテキストデータだけでなく、画像ファイルや音声ファイルなどのバイナリデータを書き込む際にも便利です。 バッファリングによって小さな書き込みがまとめられるため、大きなファイルでも効率よく保存できます。

ここでは、画像ファイルを読み込んでコピーする簡単なサンプルを紹介します。実際の開発でも頻繁に利用される操作です。


import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ImageCopyExample {
    public static void main(String[] args) {
        try (
            FileInputStream fis = new FileInputStream("input.png");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.png"))
        ) {
            byte[] buffer = new byte[4096];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

このように、画像や音声などのバイナリデータでも効率よく処理できるため、ファイルコピーやファイル変換など幅広い用途で活躍します。

6. BufferedOutputStreamを使うメリットと注意点

6. BufferedOutputStreamを使うメリットと注意点
6. BufferedOutputStreamを使うメリットと注意点

BufferedOutputStreamを使う最大のメリットは「高速化」と「無駄な書き込みの削減」です。 しかし、便利な反面、注意しておくべきポイントもあります。特に初心者の方は、以下の点を意識して使うとトラブルを防げます。

  • flush() の呼び忘れに注意:重要なデータがバッファに残ったままになることがあります。
  • close() の責務:close() には flush の意味も含まれるため、確実に try-with-resources を使いましょう。
  • バッファサイズの選び方:大きすぎるとメモリを圧迫し、小さすぎると効率が落ちます。

実際の開発では、対象ファイルのサイズや書き込み頻度に応じてバッファを調整し、効率的なファイル処理を実現することが重要です。

7. BufferedOutputStreamとBufferedInputStreamを組み合わせて使う

7. BufferedOutputStreamとBufferedInputStreamを組み合わせて使う
7. BufferedOutputStreamとBufferedInputStreamを組み合わせて使う

ファイルの読み込みと書き込みを両方効率化したい場合は、BufferedOutputStreamBufferedInputStreamをセットで使うのが定番です。読み込み側・書き込み側どちらもバッファリングされるため、 大きなファイルでもスムーズに処理できるようになります。

ここでは、バッファ付き入出力ストリームを組み合わせてファイルをコピーする例を紹介します。


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedFileCopyExample {
    public static void main(String[] args) {
        try (
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.dat"));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.dat"))
        ) {
            byte[] buffer = new byte[8192];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedInputStreamと併用することで、読み書きの両方が効率化され、特に大容量ファイルの操作で性能が安定します。 初心者の方は、まずこのような組み合わせを覚えておくとファイル処理の基礎がつかみやすくなります。

まとめ

まとめ
まとめ

BufferedOutputStreamクラスは、Javaで効率的にファイル書き込みを行うための強力なツールです。バッファリングの仕組みを利用することで、ストリームの書き込み回数を減らし、処理速度を向上させます。 初心者の方でも、この記事のサンプルコードを参考にすることで簡単に実装できます。特に大容量のデータを扱う場合や、ネットワークストリームの効率を改善したい場合には、ぜひこのクラスを活用してください。

また、BufferedOutputStreamの使い方だけでなく、flush()やバッファサイズの設定方法についても学びました。さらに、他のストリームクラスとの比較を通じて、適切な選択ができるようになったはずです。

先生と生徒の振り返り会話

生徒

BufferedOutputStreamを使うと、ファイル書き込みがどうして効率的になるんですか?」

先生

「バッファリングのおかげで、データをまとめて書き込むことでストリームへのアクセス回数が減るからです。その結果、処理が速くなるんですね。」

生徒

flush()って重要なんですね!これを呼び忘れるとどうなりますか?」

先生

「バッファに残ったデータが書き込まれないまま終わる可能性があります。それによってデータが欠けてしまうこともあるので注意が必要ですよ。」

生徒

「なるほど。他のクラスとの違いもわかったので、状況に応じて使い分けられるように練習してみます!」

先生

「素晴らしい意識ですね!このクラスを活用して、効率的なプログラムを書いていきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのBufferedOutputStreamとは何ですか?

BufferedOutputStreamはJavaのjava.ioパッケージに含まれるクラスで、ファイルやストリームへのデータ書き込みを効率化するための仕組みです。バッファリングを利用することで、データを一時的にメモリにためてからまとめて書き込むことができます。
カテゴリの一覧へ
新着記事
Springの@Transactional徹底解説!トランザクションの伝播・分離レベル・タイムアウトの基本
JavaのHashMapクラスgetメソッドの使い方を完全ガイド!初心者でもわかるjava.util入門
Thymeleafのth:fragmentを使ったテンプレートの再利用方法を完全ガイド!初心者でもわかる使い方
Javaの@PathVariableアノテーションの使い方を徹底解説!初心者でもわかるパスパラメータの基本と応用
人気記事
No.1
Java&Spring記事人気No1
Javaのラムダ式で配列を扱う!Arrays.streamの基本と注意点を初心者向けに解説
No.2
Java&Spring記事人気No2
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.3
Java&Spring記事人気No3
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.4
Java&Spring記事人気No4
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.5
Java&Spring記事人気No5
JavaのBigDecimalクラスcompareToメソッド完全ガイド!初心者でもわかる大小比較の基本
No.6
Java&Spring記事人気No6
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.7
Java&Spring記事人気No7
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.8
Java&Spring記事人気No8
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法