Java FileWriter の例

Java FileWriter

  • Java FileWriterクラスは、java.io パッケージの一部です。
  • FileWriterは、java.io.OutputStreamWriterクラスのサブクラスです。
  • FileWriterは、文字のストリームを書き込むために使用されます。
  • FileWriterは、文字ファイルに書き込むために使用されます。そのwrite()メソッドは、文字または文字列をファイルに書き込むことができます。
  • 通常、FileWriterは、BufferedWriterPrintWriterなどの上位レベルのWriterオブジェクトによってラップされ、より高性能で柔軟なメソッドを提供します。

FileWriterのコンストラクタ

  1. FileWriter(File file): 指定されたFileオブジェクトを使用してFileWriterオブジェクトを作成します。ファイルが存在しているが通常のファイルではなくディレクトリである場合、存在しないが作成できない場合、またはその他の理由で開けない場合には、IOExceptionがスローされます。
  2. FileWriter(File file, boolean append): 指定されたFileオブジェクトを使用してFileWriterオブジェクトを作成します。第2引数がtrueの場合、バイトはファイルの先頭ではなく末尾に書き込まれます。ファイルが存在しているが通常のファイルではなくディレクトリであるか、存在していないが作成できないか、または他の理由で開くことができない場合、IOExceptionがスローされます。
  3. FileWriter(FileDescriptor fd): 指定されたファイルディスクリプタに関連付けられたFileWriterオブジェクトを作成します。
  4. FileWriter(String fileName): 指定されたファイル名を使用してFileWriterオブジェクトを作成します。IOExceptionがスローされます。指定した名前のファイルが存在しているが通常のファイルではなくディレクトリであるか、存在していないが作成できないか、または他の理由で開くことができない場合。
  5. FileWriter(String fileName, boolean append): 指定されたファイル名を使用してFileWriterオブジェクトを作成します。書き込まれたデータを追加するかどうかを示すブール値も指定します。第2引数がtrueの場合、データはファイルの先頭ではなく末尾に書き込まれます。指定した名前のファイルが存在しているが通常のファイルではなくディレクトリであるか、存在していないが作成できないか、または他の理由で開くことができない場合、IOExceptionがスローされます。

Java FileWriterの例

FileWriterは、java.io.OutputStreamWriterクラスとjava.io.Writerクラスのメソッドを継承しています。以下のメソッドと例を見てみましょう。

write(int c)

このメソッドは、int cで指定された単一の文字を書き込みます。

package com.journaldev.io.filewriter;

import java.io.FileWriter;
import java.io.IOException;

/**
 * Java write file using FileWriter write method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteIntExample {

	public static void main(String[] args) {
		FileWriter fileWriter = null;
		try {
			fileWriter = new FileWriter("D:/data/file.txt");
			// java.io.OutputStreamWriterから継承されたメソッド 
			fileWriter.write(65);
			fileWriter.write(66);
			fileWriter.write(67);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (fileWriter != null) {
					fileWriter.flush();
					fileWriter.close();					
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

FileWriterはAutoCloseableインターフェースを実装しているため、FileWriterクラスを使用する際にはtry with resourcesを使用することができます。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write method using try with resource
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteIntTryWithResource {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// java.io.OutputStreamWriterから継承されたメソッド 
			fileWriter.write(65);
			fileWriter.write(66);
			fileWriter.write(67);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注意: 上記のプログラムでは、fileWriter.write(65)はAをファイルに書き込みます。というのも、65は文字Aの10進数の値であり、そのため整数65は文字Aに変換されるからです。他の文字についても同様です。

write(String str, int off, int len)

このメソッドは、String strの一部をoffからlenまで書き込みます。

  • str: 書き込む文字列
  • off: 文字の読み取りを開始するオフセット位置
  • len:書き込む文字の数

もしlenパラメータの値が負数であれば、文字は書き込まれません。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(String  s,  int  off,  int  len) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteStringExample {

	public static void main(String[] args) {
		String data = "This is FileWriter Example.";
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			//java.io.OutputStreamWriterから継承されたメソッド 
			fileWriter.write(data, 8, 10);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(char[] cbuf, int off, int len)

このメソッドは、char[] cbufからint offからint lenまでの文字の一部を書き込みます。

  • cbuf:文字配列
  • off:文字の読み取りを開始するオフセット
  • len:書き込む文字の数
package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(char[] cbuf,  int  off,  int  len) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteCharArray {

	public static void main(String[] args) {
		char[] data = "This is FileWriter Example.".toCharArray();
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			//java.io.OutputStreamWriterから継承されたメソッド 
			fileWriter.write(data, 8, 10);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(char[] cbuf)

このメソッドは、cbufで指定された文字配列を書き込みます。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(char[] cbuf) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteCharArrayExample {

	public static void main(String[] args) {
		char[] data = "This is FileWriter Example.".toCharArray();
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			//java.io.Writerから継承されたメソッド 
			fileWriter.write(data);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(String str)

このメソッドは、strで指定された文字列をファイルに書き込みます。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(String  str) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteString {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			//java.io.Writerから継承されたメソッド 
			fileWriter.write("JournalDev");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

append(char c)

このメソッドは、指定された文字をこのライターに追加します。ここで c は追加する16ビットの文字です。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter append(char c) method
 * 
 * @author pankaj
 *
 */
public class FileWriterAppendCharacter {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// java.io.Writerから継承したメソッド 
			fileWriter.write("JournalDev");
			fileWriter.append('C');
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

flush()

このメソッドはストリームをフラッシュします。 flush()メソッドが呼び出されると、データがすぐに出力ファイルに書き込まれます。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file with FileWriter flush() method
 * 
 * @author pankaj
 *
 */
public class FileWriterFlushExample {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// java.io.Writerから継承したメソッド 
			fileWriter.write("JournalDev");
			// java.io.OutputStreamWriterから継承したメソッド
			fileWriter.flush();
			
			fileWriter.write(" Tutorials");
			fileWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

close()

このメソッドは、ストリームをクローズする前にストリームをフラッシュします。ストリームが閉じられた後、write()メソッドまたはflush()メソッドを呼び出すと、IOExceptionがスローされます。以前に閉じられたストリームを閉じることは効果がありません。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file with FileWriter close() method
 * 
 * @author pankaj
 *
 */
public class FileWriterCloseExample {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// java.io.Writerから継承したメソッド 
			fileWriter.write("JournalDev");
			// java.io.OutputStreamWriterから継承したメソッド
			fileWriter.close();;
			
			fileWriter.write(" Tutorials");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

出力:

java.io.IOException: Stream closed
	at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at java.io.OutputStreamWriter.write(Unknown Source)
	at java.io.Writer.write(Unknown Source)
	at com.journaldev.examples.FileWriterCloseExample.main(FileWriterCloseExample.java:20)

FileWriter vs FileOutputStream

  • FileWriterは文字のストリームを書き込むために使用され、FileOutputStreamは生のバイトのストリームを書き込むために使用されます。
  • FileWriterは16ビットの文字を扱い、FileOutputStreamは8ビットのバイトを扱います。
  • FileWriterはUnicodeの文字列を処理できますが、FileOutputStreamは文字や文字列を受け付けないため、OutputStreamWriterでラップする必要があります。

また、Javaでファイルを書き込む方法については、java write fileを参照してください。これでJava FileWriterに関する重要な情報が抜けていないことを願っています。

すべての例のコードはGitHubリポジトリからダウンロードできます。

参考:APIドキュメント

Source:
https://www.digitalocean.com/community/tutorials/java-filewriter-example