【Java】FileOutputStreamでファイルに書き込む

Javaでバイト単位のデータをファイルに書き込みたい
FileOutputStreamクラスでファイルに書き込む方法を知りたい

javaでファイルに書き込むにはFileOutputStreamクラス、OutputStreamクラスを使用します。

ここでは、ファイルに書き込む処理について、以下の内容で解説していきます。

  • 【基礎】FileOutputStreamクラスとは
  • 【基礎】FileOutputStreamの基本的な使い方
  • 【発展】ファイルに追記する方法
  • 【発展】FileOutputStreamの注意点と回避策

今回はそんなFileOutputStreamクラスについて、さまざまな使い方をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

FileOutputStreamとは

FileOutputStreamクラスとは、ファイルにバイト単位のデータを書き込むときに使用する出力ストリームです。

FileOutputStreamクラスは以下のように記述します。

FileOutputStream file = new FileOutputStream("パス/ファイル名”);

FileOutputStreamを使用するためには、「java.io」のパッケージをインポートする必要があります。

import java.io.FileOutputStream;

また、OutputStreamクラスは、バイトでファイルに出力するFileOutputStreamクラスのスーパークラスです。

ファイルに書き込むためのwriteメソッドなどは、OutputStreamクラスで用意されているメソッドですが、FileOutputStreamクラスはOutputStreamクラスを継承しているため使用することができます。

FileOutputStreamの使い方

ファイルに書き込む方法

以下にFileOutputStreamクラスを使用して、ファイルに書き込む方法を記述します。

import java.io.FileOutputStream;
import java.io.IOException;
 
public class Main {
	public static void main(String[] args) throws IOException {
		
		//FileOutputStreamクラスのオブジェクトを生成する
		FileOutputStream fos = 
				new FileOutputStream("/Users/Shared/java/java.txt");
		
		byte b1 = 74; //ASCII:(J)
		byte b2 = 65; //ASCII:(A)
		byte b3 = 86; //ASCII:(V)
		byte b4 = 65; //ASCII:(A)
		
		fos.write(b1);
		fos.write(b2);
		fos.write(b3);
		fos.write(b4);
		
		//ファイルに書き込む
		fos.flush();
		
		//ファイルをクローズする
		fos.close();
 
	}
}

サンプルでは、FileOutputStreamクラスのオブジェクトを、ファイル/パスを指定して生成しています。

次にFileOutputStreamのwriteメソッドを使用して、書き込むデータをバッファに保存しています。

最後にcloseメソッドでファイル操作のリソースを開放します。

FileOutputStreamクラス単体では、byte型のデータの書き込みのみで、文字列をファイルに書き込むことはできません。

文字列をファイルに書き込みたい場合は、以下のプログラムのようにバイト型の配列として返すgetBytesを使用する方法があります。

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
 
public class Main {
	public static void main(String[] args) throws IOException {
		
		//FileOutputStreamクラスのオブジェクトを生成する
		FileOutputStream fos = 
				new FileOutputStream("/Users/Shared/java/java.txt");
		
		byte sbyte[] = "Java".getBytes(StandardCharsets.UTF_8);
		
		for(int i = 0; i < sbyte.length; i++){
			fos.write(sbyte[i]);
		}
		
		//ファイルに書き込む
		fos.flush();
		
		//ファイルをクローズする
		fos.close();
 
	}
}

getBytesについては、以下の記事で詳しく解説しています。

ファイルに追加で書き込む方法

ファイルに追加で書き込みたい場合は、FileOutputStreamクラスのオブジェクト生成時に、第2引数にtrueを指定します。

FileOutputStream file = new FileOutputStream("パス/ファイル名", true);

さきほど紹介した、サンプルのFileOutputStreamクラスのオブジェクト生成時の処理を、以下のように変更すれば指定したファイルにデータが追記されます。

//FileOutputStreamクラスのオブジェクトを生成する
FileOutputStream fos = 
	new FileOutputStream("/Users/Shared/java/java.txt", true);

ファイルに書き込むときの注意点

FileOutputStreamクラスに限らず、ファイル関連のクラスで存在しないパス/ファイル名を指定すると、FileNotFoundExceptionの例外が発生してしまいます。

そのため、事前にパス/ファイル名が正しいか確認する場合はFileクラスのexistsメソッドを使用して、ファイルが存在するか確認する必要があります。

FileOutputStreamクラスは、オブジェクト生成時に引数にFileクラスのオブジェクトを指定できます。

ファイルの存在が確認できたら引数に、Fileクラスのオブジェクトを指定すれば、ファイルへの書き込みが可能となります。

FileOutputStream fos = new FileOutputStream(File);

以下にファイルが存在するか、チェック処理を追加したファイルの書き込み方法を記述します。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class Main {
	
	public static void main(String[] args) throws IOException {
		
		//ファイルクラスのオブジェクトを生成する
		File file = new File("/Users/Shared/java/java.txt");
		
		//ファイルの存在有無を確認
		if (file.exists()){
			FileOutputStream fos = new FileOutputStream(file);
			
			//〜書き込み処理〜
		}
		else{
			System.out.println(file.toString() + "が存在しません");
		}
	 }
}

また、FileNotFoundExceptionの例外は、ファイルが読み取り専用などで、アクセスができなかった場合にも同様の例外が発生しますので注意が必要です。

ファイルの存在を確認する方法は、以下の記事で詳しく解説しています!

FileWriterクラスを使って文字列を書き込む方法

バイトのデータではなく、文字列を書き込むにはFileWriterクラスを使います。

FileWriterクラスを使って文字列を書き込む方法については、こちらの記事で詳しく解説しているのでぜひ確認してください。

まとめ

ここではFileOutputStreamクラスについて、意味や基本的な使い方の説明、ファイルに追記する方法や注意点についても説明しました。

Javaでファイル操作系のクラスは、さまざまな種類が存在しますので、クラスごとに役割はしっかりと把握しておきましょう。

もし、FileOutputStreamクラスの使い方を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次