カテゴリ: Java 更新日: 2025/06/30

JavaのBufferedInputStreamクラスのreadメソッドを解説!ファイルのバイトデータを効率よく読み取ろう

BufferedInputStreamのreadメソッド
BufferedInputStreamのreadメソッド

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

生徒

「Javaでファイルを読み取るにはどうすればいいんですか?」

先生

「JavaではBufferedInputStreamクラスを使えば、ファイルのデータを効率よく読み取ることができますよ。」

生徒

「効率よくって、どんなふうに読み取れるんですか?readメソッドとか使いますか?」

先生

「そのとおり!今回はBufferedInputStreamreadメソッドの使い方を詳しく説明しますね。」

1. BufferedInputStreamクラスとは

1. BufferedInputStreamクラスとは
1. BufferedInputStreamクラスとは

JavaのBufferedInputStreamクラスは、バッファ(緩衝領域)を使ってデータをまとめて読み込み、パフォーマンスを向上させるためのInputStreamのサブクラスです。

通常のFileInputStreamは1バイトずつ読み込むため処理が遅くなることがありますが、BufferedInputStreamを使うことで、一度に複数バイトをバッファにためてから読み出すことで、ディスクアクセス回数を減らし、高速な読み込みが可能になります。

2. readメソッドの基本

2. readメソッドの基本
2. readメソッドの基本

readメソッドは、BufferedInputStreamで最もよく使われるメソッドのひとつで、入力ストリームからデータを読み取るために使います。

いくつかのオーバーロードがあり、用途に応じて以下のように使い分けます。

  • int read():1バイトを読み込んで、その値を0〜255の整数で返します。
  • int read(byte[] b):バイト配列にデータを読み込みます。
  • int read(byte[] b, int off, int len):バイト配列の一部に指定長さ分だけ読み込みます。

3. int read()の使い方

3. int read()の使い方
3. int read()の使い方

int read()は最もシンプルな形式で、1バイトずつ読み取る方法です。


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

public class ReadByteExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("sample.txt"))) {
            int data;
            while ((data = bis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Hello, world!

このようにread()は1バイトずつ読み込むため、読み込んだバイトをcharにキャストして文字として出力できます。ファイルの終端に達すると-1が返されるため、それを条件にループを終了します。

4. byte配列を使ったreadメソッド

4. byte配列を使ったreadメソッド
4. byte配列を使ったreadメソッド

1バイトずつではなく、複数バイトを一度に読み取りたい場合は、read(byte[] b)を使います。


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

public class ReadBufferExample {
    public static void main(String[] args) {
        byte[] buffer = new byte[8]; // 8バイトずつ読み込み
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("sample.txt"))) {
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, bytesRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

この例では、8バイトずつデータを読み込んで文字列として表示しています。ファイルのサイズがバッファより小さい場合でも、読み取れたバイト数だけを出力することで文字化けを防げます。

5. readメソッドの戻り値に注意

5. readメソッドの戻り値に注意
5. readメソッドの戻り値に注意

readメソッドの戻り値は「読み取ったバイト数」です。ただし、int read()の場合は読み取ったバイトそのものが返され、byte[]を使う形式では読み込んだバイト数が返ります。

読み取るデータがなくなった場合、どの形式でも-1が返されることを覚えておきましょう。

6. readメソッドとBufferedInputStreamの特徴

6. readメソッドとBufferedInputStreamの特徴
6. readメソッドとBufferedInputStreamの特徴

BufferedInputStreamreadメソッドは、内部バッファからデータを取り出します。バッファが空になったときだけ、実際にディスクからまとめてデータを読み込むため、パフォーマンスが向上します。

たとえば、同じreadでもFileInputStreamでは1バイトずつ読み込むたびにディスクアクセスが発生しますが、BufferedInputStreamではバッファからの読み取りが中心になるため、高速です。

7. readメソッドの例外処理と注意点

7. readメソッドの例外処理と注意点
7. readメソッドの例外処理と注意点

読み込み処理ではIOExceptionが発生する可能性があるため、try-catchで適切に例外処理を行いましょう。また、ストリームは読み終わったら必ずcloseで閉じる必要があります。Java7以降ではtry-with-resourcesを使うことで、自動的にcloseが呼び出されます。

さらに、readメソッドはデータがすぐに読み取れるとは限らないため、ネットワークストリームや遅延のある入力では、読み込みに時間がかかることがあります。

8. BufferedInputStreamとreadを使いこなそう

8. BufferedInputStreamとreadを使いこなそう
8. BufferedInputStreamとreadを使いこなそう

Javaで効率よくファイルの中身を読み取るには、BufferedInputStreamreadメソッドの組み合わせがとても重要です。

1バイトずつ読み取るシンプルな方法から、複数バイトをまとめて処理する方法まで、用途に応じてreadメソッドを使い分けることで、快適で高速なファイル処理が実現できます。

9.まとめ

9.まとめ
9.まとめ

今回は、Javaでファイルのバイトデータを効率よく読み取るために活用されるBufferedInputStreamクラスのreadメソッドについて詳しく学びました。Javaでファイルを扱う場合、単純なFileInputStreamだけでは処理が遅くなることがあります。そこで登場するのがBufferedInputStreamです。内部にバッファを持ち、まとめて読み込んでおくことで、ディスクアクセスの回数を大幅に減らし、高速なデータ読み取りが可能になります。

readメソッドにはいくつかの種類があり、目的や処理内容に応じて使い分けることができます。int read()は最も基本的な形式で、一度に1バイトずつ読み込む方法です。これは簡単な動作確認や文字ごとの処理には適していますが、大きなファイルを扱う場合には効率が悪くなります。そんなときには、byte[]を使って複数バイトを一気に読み込むread(byte[] b)や、さらに細かく指定できるread(byte[] b, int off, int len)が役立ちます。

バッファサイズの設計もBufferedInputStreamを使ううえで重要なポイントです。読み込み単位を適切に設定することで、Javaプログラムの実行効率が大きく変わってきます。たとえば、8バイトずつ読み取る例では、処理がシンプルで高速に動作することを確認できました。読み込みのたびにディスクにアクセスするのではなく、メモリ上のバッファから高速にデータを取り出せるのがBufferedInputStreamの最大の特徴です。

また、今回の解説では、ファイル終端の判定としてreadメソッドが-1を返すこと、例外処理としてIOExceptionを必ずtry-catchで対応すること、そしてストリームのcloseを忘れずに実行する点など、Javaにおけるファイル処理の基本も丁寧におさらいしました。特にtry-with-resources構文を使えば、closeを自動で呼び出せるため、初心者にもおすすめの方法です。

以下に、BufferedInputStreamreadメソッドを活用した簡単なファイル読み込みのサンプルを再掲します。


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

public class ReadSample {
    public static void main(String[] args) {
        byte[] buffer = new byte[16]; // 読み取りバッファ
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("sample.txt"))) {
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                String output = new String(buffer, 0, bytesRead);
                System.out.print(output);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

このように、JavaのBufferedInputStreamクラスとreadメソッドを理解しておくことで、さまざまなファイル読み込み処理に柔軟に対応できるようになります。テキストファイルの読取処理はもちろん、バイナリファイルのデータ分析や、ログファイルの解析、さらにはネットワーク通信などの応用分野でも役立つ基礎技術です。

Javaプログラミングをこれから本格的に学んでいくうえで、ストリーム処理の基本をしっかりと身につけることは非常に大切です。BufferedInputStreamの動作原理を理解し、readメソッドの正しい使い方を習得することで、パフォーマンスの高いJavaアプリケーションの開発に一歩近づくことができるでしょう。

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

生徒

先生、BufferedInputStreamのreadメソッドって、いろんな使い方があるんですね!

先生

そのとおりです。1バイトずつ読む方法もあれば、バッファを使って複数バイトを一気に読む方法もあります。ファイルのサイズや処理内容に応じて使い分けるのがポイントですよ。

生徒

バッファサイズを調整するだけでパフォーマンスがよくなるっていうのも、ちょっと驚きでした!

先生

そうですね。読み込み回数を減らすことで、プログラム全体の処理速度が向上します。BufferedInputStreamはJavaの標準ライブラリの中でも非常に便利なクラスなので、今後もぜひ活用してください。

生徒

次はバイナリファイルの読み取りにも挑戦してみたいです!

先生

それは良い目標ですね。readメソッドはバイナリデータにも使えるので、今回の知識はきっと役立ちますよ。

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

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

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

JavaのBufferedInputStreamとFileInputStreamの違いは何ですか?

JavaのBufferedInputStreamはFileInputStreamと比べて、内部にバッファを持っており、複数バイトをまとめて読み込むことで高速にファイルのデータを処理できます。FileInputStreamは1バイトずつ読み込むため処理が遅くなる場合がありますが、BufferedInputStreamはそのデメリットを補うクラスです。

BufferedInputStreamのreadメソッドはどのような場面で使うのが適していますか?

JavaのBufferedInputStreamのreadメソッドは、ファイルからテキストやバイナリデータを効率よく読み取りたいときに適しています。ログファイルの解析や、テキストデータの連続読み取りなど、読み込み回数を減らして処理を高速化したい場面で効果を発揮します。

readメソッドにはどんな種類があるのですか?

JavaのBufferedInputStreamクラスには、int型を返すreadメソッド、byte配列にまとめて読み込むread(byte[] b)、配列の一部に読み込むread(byte[] b, int off, int len)の3種類があります。用途に応じて最適な形式を選ぶことで、効率よくデータ処理が行えます。

BufferedInputStreamのreadメソッドで-1が返ってくるのはなぜですか?

JavaのBufferedInputStreamでreadメソッドが-1を返すのは、ファイルの終端に到達したことを意味します。これはどの形式のreadメソッドでも共通で、ループ処理などで読み込みを終了する判定として使われます。

BufferedInputStreamのreadメソッドで読み取ったデータを文字として出力するにはどうすればいいですか?

JavaのBufferedInputStreamでreadしたバイトデータを文字として出力するには、int型の値をchar型にキャストするか、byte配列を文字列に変換します。これによりテキストファイルの中身を文字として画面に表示できます。

BufferedInputStreamを使うとき、バッファサイズはどのように決めるのがよいですか?

JavaのBufferedInputStreamでバッファサイズを決める際は、読み取るデータの量や処理内容に応じて適切に調整します。例えば、小さなテキストファイルであれば8〜16バイト、大きなログやバイナリファイルなら数百〜数千バイトが適しています。効率化のためには実行時の挙動を見ながら調整するのがベストです。

BufferedInputStreamを使ったファイルの読み取りで例外が出ることはありますか?

はい、JavaのBufferedInputStreamを使ってファイルを読み取る際にはIOExceptionが発生する可能性があります。ファイルが存在しない、権限がない、ストリームが破損しているなどの理由で例外が出るため、try-catch文で適切に処理する必要があります。

BufferedInputStreamのreadメソッドを使うとき、closeメソッドは必ず必要ですか?

はい、JavaのBufferedInputStreamでreadメソッドを使ってファイルを読み取った後は、必ずcloseメソッドでストリームを閉じる必要があります。ただし、Java7以降ではtry-with-resources構文を使うことで、自動的にcloseされるため便利です。

BufferedInputStreamのreadメソッドを使うとネットワーク通信にも使えますか?

はい、JavaのBufferedInputStreamはファイル読み取りだけでなく、ネットワーク通信の入力ストリームにも使用できます。バッファを通して効率よくデータを読み込むことができるため、通信処理にも適しています。

BufferedInputStreamのreadメソッドとScannerクラスの読み取りは何が違うのですか?

JavaのBufferedInputStreamのreadメソッドはバイト単位で読み取るのに対し、Scannerクラスは文字列やトークン単位で読み取るのが特徴です。低レベルで効率的な読み取りが必要な場合はBufferedInputStream、高レベルで文字処理をしたい場合はScannerが適しています。
カテゴリの一覧へ
新着記事
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アノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法