実はテキストと言っても、1種類とは限りません。
日本語の場合、WindowsとMacテキストで使うシフトJIS、UNIXで使うEUC-jp、メールで使うJISと、使われる場所や用途によって様々です。
また、改行コードの違いも気を付けなければなりません。
ここでは、これらのコードも含めて解説を行います。
○Java
あらゆる環境で扱う言語ですので、特に決められた日本語コードや改行コードはありません。
プログラマは実行環境をしっかりと把握して、ファイルを扱う必要があります。・テキストファイルを作成する(英字)
//オブジェクト生成
FileWriter 変数 = new FileWriter(ファイル名);
//ファイルに書き込み(改行コードは自動的に付かない)
変数.Write(文字列 + "\n");
//クローズ
変数.close();
例)ファイル名 textを生成し、文字列 a, bを出力する。try{ FileWriter fout = new FileWriter("text"); fout.Write("a\n"); fout.Write("b\n"); fout.close(); }catch(Exception e){ System.out.println("Error: " + e); }・テキストファイルを読み込む(英字)
//オブジェクト生成
FileReader 変数 = new FileReader(ファイル名);
//ファイル読み込み(-1が返るとファイルの最後)
(int) = 変数.read();
//クローズ
変数.close();
例)ファイル名 textを全部読み取り、画面に表示する。try{ int ret; FileReader fin = new FileReader("text"); while(ret = fin.read()) != -1){ System.out.println((char)ret); } fin.close(); }catch(Exception e){ System.out.println("Error: " + e); }・テキストファイルを作成する(日本語)
日本語コードには様々な種類があります。
ここでは、Windows、Macで扱うシフトJISと、UNIXで扱う EUC-JPについて説明します。
Javaは UNICODEですので、シフトJISやEUC-JPは、Java言語からすれば文字ではありません。
ゆえに、バイトストリームにて読み書きを行います。
//オブジェクト生成
FileOutputStream 変数1 = new FileOutputStream(ファイル名);
BufferedWriter 変数2 = new BufferedWriter(new OutputStreamWriter(変数1, 文字コードの種類));
//ファイルに書き込み
変数2.write(文字列 + "\n");
//クローズ(出力バッファにデータが残らないようにフラッシュする)
変数2.flush();
変数2.close();
変数1.flush();
変数1.close();
文字コードの種類は以下の通り、
文字コードの種類 説明 EUC_JP UNIXで扱われる EUC-JPコード Shift_JIS WindowsやMacintoshで扱われる シフトJISコード JIS メールで扱われる JISコード
例)ファイル名 textを生成し、文字列‘あ’、‘亜’を出力する(UNIX版)。FileOutputStream fout = new FileOutputStream("text"); BuffrerdWriter bw = new BuffrerdWriter(new OutputStreamWriter(fout "EUC_JP")); bw.write("あ\n"); bw.write("亜\n"); bw.flush(); bw.close(); fout.flush(); fout.close();例)ファイル名 textを生成し、文字列‘あ’、‘亜’を出力する(Windows版)。
FileOutputStream fout = new FileOutputStream("text"); BuffrerdWriter bw = new BuffrerdWriter(new OutputStreamWriter(fout "Shift_JIS")); bw.write("あ\r\n"); bw.write("亜\r\n"); bw.flush(); bw.close(); fout.flush(); fout.close();例)ファイル名 textを生成し、文字列‘あ’、‘亜’を出力する(Macintosh版)。
FileOutputStream fout = new FileOutputStream("text"); BuffrerdWriter bw = new BuffrerdWriter(new OutputStreamWriter(fout "Shift_JIS")); bw.write("あ\r"); bw.write("亜\r"); bw.flush(); bw.close(); fout.flush(); fout.close();容易に理解できるように、わざと3機種別々に書いてみました。
生成したファイルをどの機種で利用するのかをよく考えてプログラミングして下さい。○fb
Macで扱う言語ですので、普通に保存を行なうと、
日本語:シフトJIS
改行コード:CR
になるはずです(現時点では確認していません)
・ファイルオープン関数
OPEN "「モード」", #「オープン番号」, "「ファイル名」", 「レコード長」, 「リファレンス番号」%
・「モード」
どのように読み書きを行なうのか?
モード
説明
I
読み込み専用 O
出力専用(ファイルが既に存在している場合は消去する) R
読み書き両用 N
ネットワーク(アップルトーク)上のファイルを読み書きする A
追加書き
・「オープン番号」
入出力命令を出す際に識別を行なう番号です。
#1〜?と未知数です。ですから、1から順に使った方が賢明でしょう。
・「ファイル名」
フォルダ(ディレクトリ)を含みません。
ファイル名だけを指定して下さい。
・「レコード長」
省略すると256バイトになります。
実際問題として、1行がそんなに巨大な文字列の読み書きは考えられませんので、省略で良いでしょう。
1〜65535までしては出来るようです。
・「リファレンス番号」
どのディスクのどこのフォルダ(ディレクトリ)にあるのかを示す数値です。
省略すると、起動したプログラムと同一フォルダになります。
例)プログラムと同一フォルダにあるtestファイルをオープンする。
OPEN "I", #1, "test"
・ファイルクローズ関数
CLOSE #「オープン番号」
例)オープン番号#1を指定して開いたファイルをクローズする。
CLOSE #1
・テキスト読み込み関数(1行単位)
LINE INPUT 「オープン番号」, 「文字列変数」
1行と言うのは、改行コードCRが出現するまでの文字列を示します。
つまり、LFしかないUNIX向けに生成したコードでは不具合が生じるでしょう(確認はしていません)
例)オープン番号#1を指定して開いたファイルから、変数buf$に1行読み込む。
LINE INPUT #1, buf$
・ファイルの内容を全て読み込む
ファイルの最後を検出する関数
EOF(「オープン番号」)
ファイルの最後なら true、それ以外の時は falseを返します。
これとループを用いる事で、ファイル全てを読み込む事が出来ます。
例)テキストファイルtextの内容を全て表示する。
OPEN "I", #1, "text"
WHILE EOF(1) = false
LINE INPUT #1, $buf
PRINT $buf
WEND
CLOSE #1
・ファイル選択ダイアログを表示
ユーザーにファイルを選択させる時に表示されるダイアログです。
GUI系OSにはあって当然の機能です。
「ファイル名」=FILE$(_fOpen, "「ファイルタイプ」", , 「リファレンス番号」)
・「ファイル名」
ユーザが選択したファイル名が返って来ます。
何も返って来なければ、ユーザーがキャンセルした事を示します。
・「ファイルタイプ」
ここで指定した種類のファイルのみが、ダイアログに表示されます。
HTTPでのMIMEタイプ、Windowsでの拡張子と同類のものでしょう。
ファイルタイプ
説明
なし
全てのファイル TEXT
テキストファイル PICT
PICT画像ファイル BINA
バイナリファイル
・「リファレンス番号」
どのディスクのどこのフォルダ(ディレクトリ)にあるのかを示す数値です。
右側にありますが、ここは値が返って来る変数です。