◆PROCESSING 逆引きリファレンス
カテゴリー:ファイル操作
ファイルに文字列データを書き込むには
【解説】
PROCESSINGで本格的にファイルを操作するにはJavaの命令を使います。ですが、文字列を単純に書き出すだけで良いなら、saveStrings() という手軽に使える命令が用意されています。
ただし saveStrings() 命令は簡単であるがゆえに、細かい制御ができません。
- 追加でファイル書き込みを行いたい
- 文字コードを指定してファイルを書きたい
- 勝手に改行してほしくない
- 勝手にサブフォルダを作ってほしくない
などの制御を行いたい場合は、素直にJavaの命令を利用する事を検討しましょう。
Javaの命令を利用する方法については「ファイルに文字を追加書き込みするには」記事にまとめました。よろしければ参考としてください。
【構文】
void saveStrings( String fileName, String[] data ) ;
【パラメータ】
fileName:ファイル名
data:書き出す文字列を格納した配列
【注意】
全般的な注意について
まず最初に重要な注意ですが、saveStrings() 命令は必ず「ファイルを上書き」します。ファイルを追加書き込みすることはできません(汗)。
なにか途中まで書かれていたデータがあっても、それらは消去され、新しいデータ(data)で最初から上書きされてしまいます。
また saveStrings() 命令は文字列をファイルに書き出す命令です。バイナリデータ(画像データなど)の書き出しはできません。
書き出される文字列は必ずUTF-8 形式となり、文字列の配列要素毎に改行されます。
例えば
data [ 0 ] = “さる” ;
data [ 1 ] = “かに”;
というデータを saveStrings() すると
さる[改行]
かに[改行]
という内容のファイルが出来上がります。
ファイルは利用OSが許可している場所以外に作ることはできません。例えばWindows10では
- ドライブ直下( c:\ など )
- C:\Program Files 配下
- C:\Program Files (x86) 配下
- 許可されていないユーザフォルダ(C:\Users\ユーザ名)配下
などにはファイルを作成できません。
許可されていない場所にファイルを作ろうとすると「java.io.FileNotFoundException (アクセスが拒否されました)」例外が発生します。
空文字を書き出した場合
例えば
1 2 3 4 5 6 7 8 9 10 11 12 |
String fileName; String[] item; void setup(){ fileName = "c:\\temp\\itemList.txt"; item = new String[2]; saveStrings( fileName, item ); } void draw(){ noLoop(); } |
上記のように 確保しただけの配列を書き出すと
null[改行]
null[改行]
という内容のファイルが出来上がります。
上記は書き込んだファイルをサクラエディタで開いたところです。nullデータ は “null” という文字で書き込まれる事に注意してください。
上記で saveStrings() する前に
item[ 0 ] = null ;
item[ 1 ] = “” ;
とした場合は
null[改行]
[改行]
という内容のファイルが出来上がります。空文字は “null” という文字列ではなく、改行データのみとして書き込まれます。
デフォルトでファイルができる場所について
fileNameにファイル名だけを記述した場合や相対パスからのファイル名を記述した場合、どこにファイルが作られるかは、状況により異なります。
以下はWindowsの場合です。
●1度もスケッチファイルを格納していない状態
C:\Users\(ユーザ名)\AppData\Local\Temp\untitled(ランダムな文字)sketches\(スケッチ名)フォルダの下に保存されます。
例:C:\Users\MSLABO\AppData\Local\Temp\untitled3366624013430882680sketches\sketch_160828a
(ユーザ名)には、Windowsのログインユーザ名が入ります。
(ランダムな文字)部分は適当なものが自動生成されます。
(スケッチ名)はsketch_yymmdd[a-z]形式の初期ファイル名になります。
●1度でもスケッチファイルを格納した状態
スケッチファイルを保存したフォルダと同じ場所に保存されます。
例えば [C:\processing-3.1.2\src\sketch_160825b]フォルダにスケッチファイルを保存したなら、その下にファイルが生成されます。
ファイル名への絶対パスを指定すれば、どちらの状態であっても指定位置にファイルが作成されます。
わけのわからないパスにファイルができてしまわないように、可能なら絶対パスで保存先を指定しましょう(笑)。
サブフォルダについて
パス付きで fileName を指定すると、指定されたフォルダ配下にPROCESSINGが自動的にサブフォルダを作成した上で、ファイルを書き込みます。
例えば “c:\Temp” というフォルダがある状態で、fileNameに “c:\Temp\subFolder\hoge.txt ” を指定すると、Temp配下に subFolder というフォルダをPROCESSINGが自動的に作成して、その下に hoge.txt を書き込みます。
勝手に(親切に?)サブフォルダが作られてしまうことに注意して下さい。
fileName をプログラミングする時の注意
Windowsでは、フォルダとファイルの区切り記号に半角の “¥” 記号を使いますが、文字列でパスを指定する場合は “¥¥” のように2つ重ねて書く必要があります。
例えば fileName に “c:¥temp¥hoge.txt” を指定したい場合は、 ” c:¥¥temp¥¥hoge.txt” とプログラミングします。
【関連記事】
サンプルプログラム
文字列を書き出す例:
1 2 3 4 5 6 7 |
//アイテム一覧を作成する String[] item = { "短剣", "木の盾", "革鎧", "ターバン", "回復薬", "回復薬", "毒消し", "地図" }; //アイテムの一覧をファイルに保存する saveStrings( "c:\\temp\\itemList.txt", item ); |
上記を実行すると、” c:¥temp¥itemList.txt” というファイルに、勇者の持ち物が記録されます(笑)。
<出力サンプル>
書き出されたファイルをサクラエディタで開いてみました。配列の各項目が改行付きで書き込まれているのがわかると思います。
ファイルの存在を確認する例:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import java.io.StringWriter; import javax.swing.*; String fileIcon; String fileData; String[] item = { "短剣", "木の盾", "革鎧", "ターバン", "回復薬", "回復薬", "毒消し", "地図" }; void setup(){ size(300,300); //各パスを指定 fileIcon = dataPath("") + "\\cat_fish.png"; fileData = sketchPath() + "\\itemList.txt"; } void draw(){ } //MSGBOX関数 int msgBox( String title, String message, String iconFile ){ JFrame frame = new JFrame(); frame.setAlwaysOnTop(true); //常に最前面に表示 int inputValue; //戻り値 inputValue = JOptionPane.showConfirmDialog( frame, message, title, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, new ImageIcon( iconFile ) ); return( inputValue ); } //マウスクリックイベント void mouseClicked(){ boolean blWrite = true; File file = new File( fileData ); if( file.exists() == true ){ //データファイルが既にある場合 //MSGBOXを表示して指示を受け付ける int inputValue = msgBox( "警告", "ファイルが既に存在します。\n上書きしますか?", fileIcon ); if( inputValue == 0 ){ //上書きOK blWrite = true; } else { //上書きしない blWrite = false ; } } //上書きOKならデータを書き込む if( blWrite ) saveStrings( fileData, item ); } |
※上記サンプルを作成するにあたり、Shoken Startup Blog様、Kazzzの日記様のサイトを参考とさせて頂きました。ありがとうございます。
もう少し実用的な例です(笑)。
実行結果ウィンドウ上でマウスがクリックされたら、アイテムリストを書き込みます。
ただし、書き込もうとしているデータファイル(アイテムリスト)が既にある場合は、メッセージBOXを表示して、人間の指示を仰ぎます。
ちなみに dataPath(“”) はスケッチファイル格納フォルダ配下の data フォルダへの絶対パスを、sketchPath() はスケッチファイル格納フォルダへの絶対パスを戻します。
上記例なら
dataPath(“”) :C:\processing-3.2.1\src\sketch_160831a\data
sketchPath() :C:\processing-3.2.1\src\sketch_160831a
が戻されます※。
※スケッチファイルのフォルダは私の環境での例です。みなさんの環境にあわせて適時読み替えて下さい
MSGBOXの表示はPROCESSINGの標準命令では実現できませんので、JavaのJOptionPaneを利用しています。MSGBOXの使い方については、後日記事にしたいと思います。
<出力サンプル>
(画像URL:Free Icons 様)
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。