Java アドバンス

Java FileInputStream

1. FileInputStream

これまで、テキストファイルを読み込む際にはScannerクラスを使用してきました。Scannerは入力を「行」「単語」「数値」に分割できるため、テキスト処理には非常に便利です。

しかし、時にはより高度な制御が必要になる場合があります。例えば、画像、オーディオ、PDFなどのバイナリデータを読み込む場合や、生(raw)のバイトデータを完全に制御する必要がある場合です。このようなケースでは、FileInputStreamを使用します。

2. テキストファイルの読み込み(基本例)

この例では、FileInputStreamを使用してテキストファイルを1バイトずつ読み込み、その結果を文字としてコンソールに出力します。

2.1 実装コード例

import java.io.FileInputStream;  // FileInputStreamをインポート
import java.io.IOException;      // IOExceptionをインポート

public class Main {
  public static void main(String[] args) {
    // try-with-resources構文:FileInputStreamは自動的にクローズされる
    try (FileInputStream input = new FileInputStream("filename.txt")) {

      int i;  // 読み込まれた各バイトを格納する変数

      // ファイルの終端まで1バイトずつ読み込む(-1は「これ以上のデータなし」を意味する)
      while ((i = input.read()) != -1) {
        // バイトを文字(char)に変換してコンソールに出力
        System.out.print((char) i);
      }

    } catch (IOException e) {
      // エラー(ファイル未検出など)が発生した場合、エラーメッセージを出力
      System.out.println("ファイルの読み込み中にエラーが発生しました。");
    }
  }
}

出力結果:

Some text from filename.txt

解説: このプログラムはfilename.txtをオープンし、バイト単位で読み取り、その結果を文字としてコンソールに表示します。

3. バイナリファイルのコピー(実践例)

FileInputStreamの真の強みは、テキストだけでなくあらゆるファイル形式を処理できる点にあります。以下は、画像ファイルをコピーする実装例です。

3.1 実装コード例

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

public class CopyFile {
  public static void main(String[] args) {
    // image.jpg を copy.jpg にコピーする
    try (FileInputStream input = new FileInputStream("image.jpg");
         FileOutputStream output = new FileOutputStream("copy.jpg")) {

      int i;
      while ((i = input.read()) != -1) {
        output.write(i);  // 生のバイトを新しいファイルに書き込む
      }

      System.out.println("ファイルのコピーに成功しました。");

    } catch (IOException e) {
      System.out.println("ファイル処理中にエラーが発生しました。");
    }
  }
}

解説: このプログラムはimage.jpgを読み込み、それをcopy.jpgに書き込みます。生のバイトデータを直接扱うため、テキスト、画像、オーディオ、PDFなど、あらゆる種類のファイルをコピーすることが可能です。