◆PROCESSING 逆引きリファレンス
カテゴリー:ファイル操作
ファイルに文字を追加書き込みするには
【解説】
「ファイルに文字列データを書き込むには」では、PROCESSINGが持つ saveStrings() 命令を利用して、文字列データをテキストファイルに書き込む方法を紹介しました。
saveStrings() 命令は手軽で扱いやすいのが最大のメリットですが、以下のような特徴(制限?)も持っています。
- 追加書き込みが行えない
- NULLを書き出した場合の扱いが特殊
- 文字列は必ずUTF-8で書き込まれる
- 存在しないフォルダは自動生成されてしまう
これを欠点と見るか長所と見るかは、作りたいプログラムによります。ですが1点目の追加書き込みができないという特徴は、なにかと困る場合があるのではないでしょうか?。
複数行に渡る文字列を書き込みたい場合、saveStrings() 命令であっても、書き出す文字列を予めString配列に格納しておけば、回避することは可能です。
ですが上記に挙げたsaveStrings() の特徴を根本的に変更するためには、Javaの命令を使ってファイルを書き込む必要があります。
Javaでテキストファイルを書き込む方法については、下記サイト様などが参考となります。
ここでは文字列データを追記する例として、3つの方法を紹介します。
いずれの方法を用いる場合も、例外処理を設ける必要があります。
ここで紹介した以外にも、Javaにはファイルを操作する便利なクラスが豊富にあります。興味がある方は、調べてみると良いでしょう。
FileWriterクラスを利用する
FileWriterクラスにファイル名と追記モードを指定して、インスタンスを作成します。
インスタンスを作成したら、FileWriterクラスのwrite()メソッドでデータを書き込みます。
最後にFileWriterクラスのclose()メソッドでFileWriterクラスを閉じれば完了です。
FileOutputStreamクラスを利用する
FileOutputStreamクラスにファイル名と追記モードを指定して、インスタンスを作成します。
インスタンスを作成したら、FileOutputStreamクラスのwrite()メソッドでデータを書き込みます。
ただしFileOutputStreamクラスは文字列を直接書き込む事はできませんので、書き込み対象となる文字列は byte配列に変換する必要があります。
最後にFileOutputStreamクラスのclose()メソッドでFileOutputStreamクラスを閉じれば完了です。
OutputStreamWriterクラスを利用する
まずFileOutputStreamクラスを使って、インスタンスを作成します。
続いて作成したFileOutputStreamクラスのインスタンスを元に、OutputStreamWriterクラスのインスタンスを作成します。
書き込みはOutputStreamWriterクラスのwrite()メソッドで行います。
最後にOutputStreamWriterクラスとFileOutputStreamクラスを閉じれば完了です。
FileWriterクラスだけで書く場合との違いは、書き込む際に文字コードの指定が行えることです。
【構文】
FileWriterクラス
●インスタンスを生成する
FileWriter fw = new FileWriter( String fileName ) ;
FileWriter fw = new FileWriter( String fileName, boolean append ) ;
●書き込む
void fw . write( String msg ) ;
●閉じる
void fw . close( ) ;
fw : FileWriter クラスのインスタンス変数
fileName : 出力ファイル名
append : true なら追記 false なら上書き
msg : 書き出す文字列
FileOutputStreamクラスを利用する
●インスタンスを生成する
FileOutputStream fs = new FileOutputStream( String fileName ) ;
FileOutputStream fs = new FileOutputStream( String fileName , boolean append ) ;
●書き込む
void fs . write( byte[] data ) ;
●閉じる
void fs . close( ) ;
fs : FileOutputStream クラスのインスタンス変数
fileName : 出力ファイル名
append : true なら追記 false なら上書き
data : 書き出すバイナリデータ
OutputStreamWriterクラスを利用する
●インスタンスを生成する
OutputStreamWriter os = new OutputStreamWriter( OutputStream out ) ;
OutputStreamWriter os = new OutputStreamWriter( OutputStream out, String charsetName ) ;
●書き込む
void os . write( String msg ) ;
●閉じる
void os . close( ) ;
os : OutputStreamWriter クラスのインスタンス変数
out : 出力ストリーム。FileOutputStreamのインスタンス変数でOK
charsetName: エンコードキャラクタ名。
msg : 書き出す文字列
●エンコードキャラクタ名の代表例
UTF-8
UTF-16
UTF-16BE
UTF-16LE
EUC-JP
Shift_JIS
詳しくは Oracle JavaSE ドキュメント を参照してください。
【注意】
全般的な注意
各クラスは何れも、何か異常があった場合は例外を発生させます。適切な例外処理を行ったうえで利用する必要があります。
PROCESSINGの saveStrings() とは異なり、書き込み対象となるファイルまでのパス(フォルダ)が存在しないと、インスタンス作成時に例外が発生します。
また文字列の最後には改行コードが付加されません。改行したい場合は、自分で改行コードを付け加える必要があります。
各クラスでは何れもデータの書き込みを終了する場合に、必ず close() メソッドを発行する必要があります。
FileWriterとOutputStreamWriter では、close() するとそれまでバッファリングされていたものをファイルに書き出して(フラッシュして)ファイルを閉じます。
FileWriterクラスを利用する
文字列データを単純にファイルに追記したいだけなら、もっともシンプルな命令です。
インスタンス作成時に、append 指定を省略すると上書きモードで処理されます。
FileWriterでは書き込む文字列の文字コードを指定する事ができません。特に工夫をしない場合、デフォルトの文字セット(WindowsならShift-JIS)が利用されます。
FileWriterではバイナリデータ(画像データなど)を書き込むことはできません。
FileOutputStreamクラスを利用する
本来は文字列データではなくバイナリデータを書き込む為の命令です。今回は下記で紹介する OutputStreamWriter を利用するための前段処理として利用しています。
インスタンス作成時に、append 指定を省略すると上書きモードで処理されます。
FileOutputStreamで文字列を書き出す事も不可能ではありませんが、そのためには文字列(Stringやchar)をbyte配列に変換する必要があります。
OutputStreamWriterクラスを利用する
FileWriterとの違いは、書き込む文字列の文字コードを指定する事ができる所です。
文字コード指定を省略した場合は、デフォルトの文字セット(WindowsならShift-JIS)が利用されます。
OutputStreamWriterもバイナリデータ(画像データなど)を書き込むことはできません。
【関連記事】
サンプルプログラム
FileWriterクラスを利用する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.io.FileWriter; void setup(){ size(100,100); String file = dataPath("") + "\\test.txt"; textWrite( file, "1:ほげ\n" ); textWrite( file, "2:ふが\n" ); noLoop(); } void draw(){ } void textWrite( String fileName, String msg ){ try { FileWriter fw = new FileWriter( fileName, true ); //以下なら上書き //FileWriter fw = new FileWriter( fileName ); fw.write(msg); fw.close(); } catch (Exception ex) { //例外 ex.printStackTrace(); } } |
FileWriter クラスを利用したシンプルなファイル書き込み処理の例です。
FileWriter クラスのインスタンス作成時に true を指定しているので、各文字列がファイルに追記されていきます。
書き込まれる文字コードは、Windows環境では Shift-JIS になります。
PROCESSINGの saveStrings() 命令と同じように文字列を上書きしたい場合は、コメント化されているコードを有効化してください。
また上記はWindows用のサンプルです。LinuxやOSXで利用する場合は、改行コードを適切なものに変更してください。
<出力サンプル>
上記は書き込んだファイルをサクラエディタで開いた様子です。
FileOutputStreamクラスを利用する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.io.FileOutputStream; void setup(){ size(100,100); String file = dataPath("") + "\\test.txt"; textWrite( file, "1:ほげ\n" ); textWrite( file, "2:ふが\n" ); noLoop(); } void draw(){ } void textWrite( String fileName, String msg ){ try { FileOutputStream fos = new FileOutputStream( fileName, true ); //以下なら上書き //FileOutputStream fos = new FileOutputStream( fileName ); fos.write( msg.getBytes() ); fos.close(); } catch (Exception ex) { //例外 ex.printStackTrace(); } } |
FileOutputStream クラスはバイナリデータを書き込む為に利用する事が多いクラスですが、この例ではあえて文字列を書き込んでいます(笑)。
FileOutputStream クラスのwrite 命令には直接文字列を渡せない為、文字列を String.getByte() 命令で byte配列に変換しています。
書き込まれる文字コードは、Windows環境では Shift-JIS になります。
OutputStreamWriterクラスを利用する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.io.FileOutputStream; import java.io.OutputStreamWriter; void setup(){ size(100,100); String file = dataPath("") + "\\test.txt"; textWrite( file, "1:ほげ\n", "UTF-8" ); textWrite( file, "2:ふが\n", "UTF-8" ); noLoop(); } void draw(){ } void textWrite( String fileName, String msg, String enc ){ try { FileOutputStream fos = new FileOutputStream( fileName, true); //以下なら上書き //FileOutputStream fos = new FileOutputStream( fileName ); OutputStreamWriter osw = new OutputStreamWriter(fos,enc); osw.write(msg); osw.close(); fos.close(); } catch (Exception ex) { //例外 ex.printStackTrace(); } } |
OutputStreamWriterクラスを利用したファイル書き込み処理の例です。
これまでの例とは異なり、文字列データが UTF-8 で書き込まれます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。