Java InputStream クラス

InputStream は Java I/O システムでバイトデータを読み取るための抽象基底クラスであり、java.ioパッケージ内に位置します。

InputStream はすべてのバイト入力ストリームの親クラスであり、バイトデータを読み取るための基本的な枠組みを提供します。

InputStream は抽象クラスであり、直接インスタンス化することはできませんが、そのサブクラス(FileInputStream、ByteArrayInputStream など)を使用して具体的な入力ストリームオブジェクトを作成できます。


コアメソッドの解析

InputStream は Java IO ストリームの一部であり、バイト(8ビット)単位でデータを読み取るために使用されます。

InputStream は、画像、音声、動画、圧縮ファイルなどの非テキスト型データの処理に適しています。

これは「水道管」のようなものと考えてください。データは水源からプログラムへと水のように流れます。

コアメソッド

メソッド名機能説明
int read()1バイトを読み取り、戻り値は0〜255のint値です。ストリームの末尾に達した場合は-1
int read(byte[] b)ストリームから最大b.lengthバイトのデータを読み取り、バイト配列に格納しますb
int read(byte[] b, int off, int len)からoffオフセット位置から最大lenバイトを配列にb
void close()ストリームを閉じ、関連するリソースを解放します

単一バイトの読み取り

public abstract int read() throws IOException

これは InputStream の最も基本的なメソッドで、入力ストリームから次のバイトのデータを読み取ります。戻り値は0〜255のint値で、ストリームの末尾に達した場合は -1 を返します。

サンプルコード

例

InputStream input = new FileInputStream("example.txt");
int data = input.read();
while(data != -1) {
    System.out.print((char)data);
    data = input.read();
}
input.close();

バイト配列の読み取り

例

public int read(byte[] b) throws IOException

このメソッドは、最大 b.length バイトのデータをバイト配列に読み取ろうとし、実際に読み取ったバイト数を返します。ストリームの末尾に達した場合は -1 を返します。

サンプルコード

例

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
    System.out.println("Read " + bytesRead + " bytes");
}
input.close();

から格納を開始し、最大500バイト読み取る

例

public int read(byte[] b, int off, int len) throws IOException

このメソッドでは、読み取ったデータをどの位置から格納するか(off)と、最大で何バイト読み取るか(len)を指定できます。

サンプルコード

例

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // buffer
input.close();

バイトのスキップ

例

public long skip(long n) throws IOException

入力ストリーム内の n バイトのデータをスキップして破棄し、実際にスキップしたバイト数を返します。

利用可能なバイトの確認

例

public int available() throws IOException

この入力ストリームからブロックせずに読み取る(またはスキップできる)推定バイト数を返します。

2.6 ストリームを閉じる

例

public void close() throws IOException

入力ストリームを閉じ、関連するすべてのシステムリソースを解放します。これは非常に重要なメソッドであり、ストリーム操作が完了した後に呼び出す必要があります。


よく使われるサブクラスの紹介

  • FileInputStream: ファイルからデータを読み取るために使用されます。
  • ByteArrayInputStream: メモリ内のバイト配列を入力ストリームとして使用できます。
  • FilterInputStream: 他の入力ストリームに追加機能を提供するデコレータクラスです。
  • ObjectInputStream: 以前に ObjectOutputStream でシリアライズされたオブジェクトをデシリアライズするために使用されます。
  • PipedInputStream: PipedOutputStream と組み合わせて使用し、スレッド間のパイプ通信を実現します。

ベストプラクティス

try-with-resources を使用する

Java 7 で try-with-resources 文が導入され、AutoCloseable インターフェースを実装したリソースを自動的に閉じることができます。

例

try (InputStream input = new FileInputStream("example.txt")) {
    int data;
    while ((data = input.read()) != -1) {
        System.out.print((char)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

バッファ読み取りでパフォーマンスを向上

大容量ファイルや頻繁な読み取り操作の場合は、パフォーマンスを向上させるために BufferedInputStream でラップすることをお勧めします。

例

try (InputStream input = new BufferedInputStream(new FileInputStream("largefile.dat"))) {
    // 読み取り操作
} catch (IOException e) {
    e.printStackTrace();
}

例外を正しく処理する

IO操作は IOException をスローする可能性があるため、これらの例外を適切に処理する必要があります。


5. よくある質問

read() メソッドはなぜ byte ではなく int を返すのですか?

ストリームの終わりを示す特別な値(-1)が必要であり、byte 型では -1 を表せないためです。

InputStream を String に変換するには?

例

public static String convertToString(InputStream input) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    }
}

InputStream をコピーするには?

InputStream は通常1回しか読み取れません。複数回読み取る必要がある場合は、その内容をバイト配列や ByteArrayInputStream にコピーできます。


6. まとめ

InputStream クラスは Java I/O システムのコアコンポーネントの1つであり、バイトデータを読み取るための基本的な機能を提供します。InputStream とそのサブクラスを理解することは、さまざまな入力ソース(ファイル、ネットワーク接続、メモリバッファなど)を扱う上で非常に重要です。実際のアプリケーションでは、リソース管理、例外処理、パフォーマンス最適化などに注意する必要があります。

その他の拡張