Java アドバンス

Java FileOutputStream

1. FileOutputStream

これまでの章では、FileWriterを使用してファイルにテキストを書き込む方法を学びました。

FileOutputStreamクラスも同様の仕組みで動作しますが、データを生のバイト(raw bytes)として書き込みます。つまり、テキストファイルだけでなく、バイナリファイル(画像、PDF、オーディオなど)の作成や編集にも利用できるということです。

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

この例では、FileOutputStreamを使用して、短いテキスト文字列をファイルに書き込みます。

注意: 指定したファイルが既に存在する場合、その内容は新しいデータで上書き(Overwrite)されます。

2.1 実装コード例

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

public class Main {
  public static void main(String[] args) {
    // 書き込みたいテキスト
    String text = "Hello World!";

    // try-with-resources構文:ストリームは自動的にクローズされる
    try (FileOutputStream output = new FileOutputStream("filename.txt")) {
      // テキストをバイト配列に変換して書き込む
      output.write(text.getBytes());
      System.out.println("ファイルへの書き込みに成功しました。");
    } catch (IOException e) {
      System.out.println("ファイルの書き込み中にエラーが発生しました。");
      e.printStackTrace();
    }
  }
}

出力結果:

ファイルへの書き込みに成功しました。

解説: このプログラムは filename.txt を新規作成(または上書き)し、その中に "Hello World!" を書き込みます。正常に動作すればコンソールに成功メッセージが表示され、問題が発生した場合はエラーメッセージが表示されます。

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

FileOutputStreamの真の強みは、テキスト以外のあらゆるファイル形式を扱える点にあります。以下は、画像ファイルをコピーする実装例です。

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 b;
      // 終端に達するまで1バイトずつ読み込む
      while ((b = input.read()) != -1) {
        // 各バイトを新しいファイルに書き込む
        output.write(b);
      }
      System.out.println("ファイルのコピーに成功しました。");
    } catch (IOException e) {
      System.out.println("ファイル処理中にエラーが発生しました。");
    }
  }
}

解説: このプログラムは image.jpg を読み込み、copy.jpg に出力します。生のバイトデータを直接操作するため、テキスト、画像、音声、PDFなど、ファイルの種類を問わずコピーが可能です。

4. ファイルへの追記(アペンドモード)

デフォルトでは、FileOutputStream は既存のファイルを上書きします。既存の内容を保持したまま、新しいデータを**追記(Append)**したい場合は、コンストラクタの第2引数に true を渡します。

4.1 実装コード例

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

public class Main {
  public static void main(String[] args) {
    String text = "\n追記されたテキストです!";

    // 第2引数に true を指定 = 追記モード(既存の内容を保持)
    try (FileOutputStream output = new FileOutputStream("filename.txt", true)) {
      output.write(text.getBytes());
      System.out.println("ファイルへの追記に成功しました。");
    } catch (IOException e) {
      System.out.println("ファイルの書き込み中にエラーが発生しました。");
      e.printStackTrace();
    }
  }
}

出力結果:

ファイルへの追記に成功しました。

解説: このプログラムは filename.txt の末尾に「追記されたテキストです!」という文字列を追加します。以前からファイルにあったデータは消去されずに残ります。