カテゴリ: Java 更新日: 2026/02/04

JavaのBufferedInputStreamクラスとskipメソッドの使い方を解説!ファイル読み込みで特定バイトを飛ばす方法

BufferedInputStreamのskipメソッド
BufferedInputStreamのskipメソッド

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

生徒

「Javaでファイルを読み込むときに、先頭の何バイトかを飛ばして読みたいときってありますか?」

先生

「はい、ありますよ。たとえばファイルのヘッダー部分だけをスキップして中身を読みたいときなどですね。そういうときはBufferedInputStreamskipメソッドを使うんです。」

生徒

「へえ、それって簡単に使えるんですか?」

先生

「はい、とても簡単ですよ。ではskipメソッドの基本的な使い方から詳しく見ていきましょう!」

1. BufferedInputStreamクラスとは

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

BufferedInputStreamクラスは、JavaのInputStreamを拡張して、効率よくデータを読み込むためのバッファ機能を追加したクラスです。通常のFileInputStreamと組み合わせて使われることが多く、一度に複数バイトを内部バッファに読み込むことで、読み取り操作の高速化が図れます。

バッファがあることで、ディスクアクセス回数が減り、プログラムのパフォーマンスが向上します。特に大きなファイルを扱うときにはBufferedInputStreamが重宝されます。

2. skipメソッドとは?

2. skipメソッドとは?
2. skipメソッドとは?

skipメソッドは、InputStream(そしてもちろんBufferedInputStream)で利用できるメソッドで、指定したバイト数だけ読み飛ばす(スキップする)ことができます。

ファイルやデータの先頭部分を無視したいときに便利で、バイナリファイルのヘッダー情報を読み飛ばして本文から処理を始めたい場合などに活用されます。

3. skipメソッドの使い方

3. skipメソッドの使い方
3. skipメソッドの使い方

それでは実際にBufferedInputStreamskipメソッドを使って、ファイルの先頭10バイトをスキップする例を見てみましょう。


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

public class SkipExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("sample.txt"))) {
            long skipped = bis.skip(10); // 最初の10バイトをスキップ
            System.out.println("スキップしたバイト数: " + skipped);

            int data;
            while ((data = bis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

スキップしたバイト数: 10
(ファイルの11バイト目からの内容が表示される)

skipメソッドは、実際にスキップできたバイト数を戻り値として返します。スキップしたいバイト数よりもファイルの残りが少ない場合、残り分だけスキップされます。

4. skipメソッドの戻り値と注意点

4. skipメソッドの戻り値と注意点
4. skipメソッドの戻り値と注意点

skipメソッドは、スキップできたバイト数をlong型で返します。これは、指定した値そのままとは限らず、実際にスキップできた量だけが返されます。

たとえば、空のファイルに対してskip(10)を呼び出した場合、戻り値は0となり、何もスキップできなかったことがわかります。

また、負の値を指定するとIllegalArgumentExceptionが発生する可能性があるため、skipの引数には必ず0以上の値を指定するようにしましょう。

5. skipメソッドとreadメソッドの違い

5. skipメソッドとreadメソッドの違い
5. skipメソッドとreadメソッドの違い

readメソッドはバイトデータを読み込んで処理するためのものですが、skipメソッドはあくまで「読み飛ばす」ためのメソッドです。

読み取る必要のないバイトを無視したいときにはskipを使い、必要なデータはreadで受け取るという使い分けが基本です。

6. skipメソッドはどんな場面で使う?

6. skipメソッドはどんな場面で使う?
6. skipメソッドはどんな場面で使う?

BufferedInputStreamskipメソッドは、以下のような場面で使われます。

  • バイナリファイルのヘッダー部分を飛ばして読みたいとき
  • ログファイルなどで先頭の古いデータをスキップして最新のデータだけ処理したいとき
  • テスト用のデータ読み込みで、途中から読みたいとき
  • ネットワークストリームで不要なバイトをスキップしたいとき

このように、柔軟にストリームの位置を調整したいときにskipメソッドはとても便利です。

7. BufferedInputStreamとskipの組み合わせで効率的な読み込み

7. BufferedInputStreamとskipの組み合わせで効率的な読み込み
7. BufferedInputStreamとskipの組み合わせで効率的な読み込み

BufferedInputStreamを使えば、通常のInputStreamよりも高速で効率的にデータを読み込むことができます。そしてskipメソッドを組み合わせることで、無駄な部分を読み飛ばし、必要な情報だけを的確に処理できるようになります。

大容量ファイルや特定位置からの読み取りが必要なケースで、BufferedInputStreamskipの活用は非常に効果的です。

まとめ

まとめ
まとめ

ここまで、Javaにおける「BufferedInputStream」クラスと、その重要な機能の一つである「skipメソッド」について詳しく解説してきました。Javaでファイルを扱う際、特にバイナリデータや大容量のテキストファイルを処理する場合、効率的な読み込み処理は避けて通れない課題です。その解決策として、バッファリングという仕組みを持つBufferedInputStreamは非常に強力な味方となります。

Java入出力におけるBufferedInputStreamの役割

JavaのI/O(Input/Output)操作において、FileInputStreamなどの基本的なクラスは、ディスク上のファイルに対して1バイトずつアクセスを行います。しかし、OSにとってディスクへの直接アクセスは非常にコストの高い(時間がかかる)処理です。そこで、BufferedInputStreamが登場します。このクラスは、内部にメモリ上の「バッファ(一時保管場所)」を持ち、一度のアクセスでまとめてデータをメモリに展開します。プログラムがデータを読み取る際は、この高速なメモリ上のバッファから取得するため、全体のパフォーマンスが劇的に向上するのです。

skipメソッドによる柔軟なデータ制御

単にデータを読み込むだけでなく、「特定の箇所から読み始めたい」というニーズに応えるのがskipメソッドです。例えば、画像のフォーマットや独自のバイナリデータ形式では、先頭に「ヘッダー」と呼ばれるメタ情報が含まれていることが一般的です。実際のコンテンツ(画像データそのものなど)にアクセスするために、この固定長ヘッダーを読み飛ばす必要があります。readメソッドを使ってループ内で捨てることも可能ですが、skipメソッドを使う方がコードの意図が明確になり、可読性が向上します。

応用:複数回のスキップと実用的なサンプルプログラム

実務では、1回スキップするだけでなく、条件に応じて読み飛ばすバイト数を変えることもあります。以下のサンプルコードでは、より実践的な形式として、特定の位置をスキップしながら断続的にデータを抽出する様子を示します。


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

/**
 * BufferedInputStreamのskipメソッドを活用した
 * 応用的なファイル読み込みサンプル
 */
public class AdvancedSkipExample {
    public static void main(String[] args) {
        String filePath = "data_file.dat"; // 解析対象のファイル名
        
        // try-with-resources文を使用してリソースを確実にクローズ
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath))) {
            
            System.out.println("--- ファイル解析を開始します ---");

            // 1. 最初のメタデータ(5バイト)をスキップ
            long firstSkip = bis.skip(5);
            System.out.println("最初の5バイトをスキップしました(実際:" + firstSkip + "バイト)");

            // 2. 続く3バイトを読み取って処理
            System.out.print("重要データ1: ");
            for (int i = 0; i < 3; i++) {
                int data = bis.read();
                if (data != -1) {
                    System.out.print((char) data);
                }
            }
            System.out.println();

            // 3. さらに中間データ(20バイト)を飛ばして次へ
            long secondSkip = bis.skip(20);
            System.out.println("中間の20バイトをスキップしました(実際:" + secondSkip + "バイト)");

            // 4. 残りのデータを最後まで読み取る
            System.out.print("重要データ2: ");
            int remainingData;
            while ((remainingData = bis.read()) != -1) {
                System.out.print((char) remainingData);
            }
            System.out.println("\n--- 解析が完了しました ---");

        } catch (IOException e) {
            System.err.println("ファイル読み込み中にエラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

skipメソッドを使いこなすための重要ポイント

記事の中でも触れましたが、skipメソッドの戻り値をチェックすることは非常に重要です。指定したバイト数(n)を必ずしもスキップできるとは限りません。ファイルの終端(EOF)に達した場合や、ネットワークストリームの状態によっては、要求したよりも少ないバイト数しかスキップできないことがあるからです。堅牢なプログラムを作成する際は、戻り値をループで確認しながら、確実に目的のバイト数分スキップされるまで繰り返すといった処理も検討されます。

また、パフォーマンスの面でも利点があります。多くの場合、skipメソッドはデータを実際に読み込むのではなく、ファイルポインタ(読み取り位置)を直接移動させるため、readで読み捨てるよりも高速に動作することが期待できます。Javaのバージョンや基底となるストリームの種類によっては、ネイティブな最適化が行われることもあるため、効率を重視するなら積極的に活用すべきメソッドと言えるでしょう。

最後に:ストリーム操作の習得に向けて

Javaにおけるファイル操作の基本は、ストリームの流れを意識することです。BufferedInputStreamとskipメソッドの組み合わせをマスターすれば、データの読み取り効率を最大化しつつ、自由自在にアクセスポイントを操作できるようになります。今回学んだ「バッファによる高速化」と「skipによる位置制御」の概念は、Java以外のプログラミング言語でも共通する非常に普遍的な技術です。この記事を参考に、ぜひ自身のプロジェクトや学習用コードに取り入れて、その便利さを実感してみてください。

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

生徒

「先生、ありがとうございました!BufferedInputStreamとskipメソッドの関係がよく分かりました。ただの読み飛ばしだと思っていましたけど、戻り値をチェックしたり、バッファの効果を考えたりと、奥が深いんですね。」

先生

「その通りです。プログラミングにおいて、ただ動くだけでなく『なぜ効率的なのか』を知ることはとても大切ですよ。戻り値がlong型なのも、非常に大きなファイルを扱うことを想定しているからなんです。」

生徒

「なるほど。大きなファイルになればなるほど、スキップの速さやバッファの恩恵が大きくなるんですね。そういえば、間違えてマイナスの値をskipに入れようとしたらどうなるんですか?」

先生

「良い質問ですね。基本的にskipメソッドに負の値を渡すと、何もスキップされずに0が返るか、実装によっては例外が発生します。戻り先(巻き戻し)を指定したい場合は、markメソッドとresetメソッドという別の仕組みを使う必要があるんです。今回のskipはあくまで『前進』するためのものだと覚えておきましょう。」

生徒

「前進専用なんですね!ファイル解析のプログラムを作るときに、ヘッダーを飛ばして中身だけ取り出す処理を早速実装してみようと思います。try-with-resourcesを使えばclose忘れも防げるし、安全に書けそうです。」

先生

「素晴らしいですね。実際のバイナリファイルを解析してみると、もっと理解が深まりますよ。まずは小さなサンプルファイルから試して、挙動を一つずつ確認していきましょう。何かわからないことがあれば、いつでも聞いてくださいね!」

Javaの基礎を最初から体系的に学びたい人には、 初心者向けで定評のある定番入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Java
JavaのLocalDateTimeクラスとplusMinutesメソッドを完全ガイド!初心者でもわかる分単位の時間操作
新規投稿
New4
Spring
SpringDataJPAのJPAクエリメソッド「IsNotNull」と「NotNull」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.4
Java&Spring記事人気No4
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.5
Java&Spring記事人気No5
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.6
Java&Spring記事人気No6
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説