Java FileWriterクラスjava.io.FileWriter
を使用すると、ファイルに文字を書き込むことができます。 その点で、Java FileWriterはFileOutputStream
とよく似ていますが、FileOutputStream
はバイトベースですが、FileWriter
は文字ベースです。 つまり、FileWriter
はテキストを書くことを意図しています。 使用されている文字エンコード方式に応じて、一つの文字は一つ以上のバイトに対応することができます。 JavaFileWriter
クラスは、Java Writerクラスのサブクラスです。
FileWriterの例
ここでは、単純なJavaFileWriter
の例です:
Writer fileWriter = new FileWriter("data\filewriter.txt");fileWriter.write("data 1");fileWriter.write("data 2");fileWriter.write("data 3");fileWriter.close();
メモ: 明確にするために、適切な例外処理はここでスキップされています。 正しい例外処理の詳細については、”Java IO例外処理”を参照してください。
FileWriter
には他のコンストラクタもあり、書き込み先のファイルをさまざまな方法で指定できます。 より詳細な情報については、公式のJavaDocを参照してください。
上書きとファイルの追加
JavaFileWriter
を作成するときに、同じ名前の既存のファイルを上書きするか、既存のファイルに追加するかを決定できます。 それを決定するには、使用するFileWriter
コンストラクタを選択します。
FileWriter
コンストラクタは、ファイル名というパラメータを一つだけ取ると、既存のファイルを上書きします:
Writer fileWriter = new FileWriter("c:\data\output.txt");
FileWriter
ファイル名とブール値:あまりにも2つのパラメータを取るコンストラクタを持っています。 ブール値は、既存のファイルを追加するか上書きするかを示します。 以下は、それを示す2つのJavaFileWriter
の例です:
Writer fileWriter = new FileWriter("c:\data\output.txt", true); //appends to fileWriter fileWriter = new FileWriter("c:\data\output.txt", false); //overwrites file
FileWriter文字エンコーディング
FileWriter
は、アプリケーションが実行されているコンピュータの既定の文字エンコーディングを使用して、バイトをファイルにエンコードすることを前提としています。 これは常にあなたが望むものではないかもしれません、そしてあなたはそれを変えることはできません!
別の文字エンコード方式を指定する場合は、FileWriter
を使用しないでください。 代わりにOutputStreamWriter
をFileOutputStream
に使用します。 OutputStreamWriter
を使用すると、基になるファイルにバイトを書き込むときに使用する文字エンコード方式を指定できます。JavaFileWriter
write(int)
メソッドは、int
の下位16ビットをFileWriter
が接続されている宛先に単一の文字として書き込みます。 JavaFileWriter
に単一の文字を書き込む例を次に示します:
FileWriter fileWriter = new FileWriter("data/output.txt");fileWriter.write('A');
write(char)
JavaFileWriter
には、FileWriter
が接続されている宛先に文字の配列を書き込むことができるwrite(char)
メソッドもあります。 write(char)
メソッドは、実際にFileWriter
に書き込まれた文字数を返します。 Javaに文字の配列を書き込む例を次に示しますFileWriter
:
FileWriter fileWriter = new FileWriter("data/output.txt");char chars = new char{'A','B','C','D','E'};fileWriter.write(chars);
書き込みパフォーマンス
一度に一つの文字を書き込むよりも、Java FileWriterに文字の配列を書き込む方が高速です。 高速化は非常に重要なことができます-最大10倍以上。 したがって、可能な限りwrite(char)
メソッドを使用することをお勧めします。
あなたが得る正確なスピードアップは、Javaコードを実行するコンピュータの基礎となるOSとハードウェアに依存します。 高速化は、メモリ速度、ハードディスク速度、バッファサイズなどの問題に依存します。
Bufferedwriterを介した透過的なバッファリング
JavaFileWriter
に書き込まれたバイトの透過的なバッファリングをJava BufferedWriterでラップすることで取得できます。 BufferedWriter
に書き込まれたすべてのバイトは、最初にBufferedWriter
の内部バイト配列内にバッファされます。 バッファがいっぱいになると、バッファは一度に基になるFileWriter
にフラッシュされます。 ここでは、JavaFileWriter
をaでラップする例を示しますBufferedWriter
:
int bufferSize = 8 * 1024;Writer writer = new BufferedWriter( new FileWriter("c:\data\output-file.txt"), bufferSize );
あなたは私のBufferedWriterチュートリアルでBufferedWriter
についての詳細を読むことができます。
flush()
JavaFileWriter
のflush()
メソッドは、FileWriter
に書き込まれたすべてのデータを基になるファイルにフラッシュします。 データは、JavaコードがFileWriter
に書き込んだ場合でも、どこかのOSメモリにバッファされる可能性があります。 flush()
を呼び出すと、バッファされたデータがディスクにフラッシュ(書き込まれる)ことを保証できます。 JavaFileWriter
に書き込まれたデータをflush()
メソッドを呼び出してフラッシュする例を次に示します:
fileWriter.flush();
FileWriter
を閉じるjavaFileWriter
への文字の書き込みが終了したら、それを閉じることを忘れないでください。 FileWriter
を閉じるには、close()
メソッドを呼び出します。 JavaFileWriter
を閉じる方法は次のとおりです:
fileWriter.close();
また、java7で導入されたtry-with-resources構造体を使用することもできます。 Try-with-resources構造を使用してFileWriter
を使用して閉じる方法は次のとおりです。
try(FileWriter fileWriter = new FileWriter("data\filewriter.txt") ){ fileWriter.write("data 1"); fileWriter.write("data 2"); fileWriter.write("data 3");}