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 の末尾に「追記されたテキストです!」という文字列を追加します。以前からファイルにあったデータは消去されずに残ります。