ファイルアクセス (4/6)
作成:2010-01-14 19:05
更新:2010-01-14 19:05
更新:2010-01-14 19:05
■FileReaderによるテキスト読み込み
では、引き続いて読み込みについて説明しましょう。こちらは「readTextFromFile」というメソッドで行なっています。基本的には書き出しと同じなんですが、実はちょっとややこしいんです。
下に掲載したリストが読み込み処理のメソッドです。try構文をまず用意して、最初にFileDialogを使ってファイルのパスと名前を取り出すところまではほぼ同じです。が、そこから先が違います。
ファイルの読み込みは「Reader」というリーダーを使います。が、このReader、読み込むのがちょっと厄介なんです。読み込むための「read」というのは用意してありますが、これは1文字(charという値)しか読めません。まとめて読み込むものもあるんですが、それは「char配列」っていうものの値で取り出されるようになっていて「何文字分読め」って感じで読んでいかないといけないのです。
考えてみれば、書き出す時は、書くデータは最初から全部わかってます。けれど読む時は、そのファイルに何文字データがあるか、何行あるかなんてことはわかりません。どれだけデータがあるかわからない状態で、出たとこ勝負で読んでいくわけです。
○BufferedReaderクラス○
そこでテキストを読み込むときは、もう少し賢いリーダーとして用意されている「BufferedReader」というものを使うのが一般的です。これはパラメータにFileReaderを指定して作ります。
このBufferedReaderを使うと何が便利なのかというと、1行ずつStringでテキストを読むことができるのです。「readLine()」というメソッドがそれで、これを呼び出すことで1行のテキストを取り出すことができます。(今回は使ってませんが、書き出しにも、BufferdWriterというクラスがちゃんと用意されています)
そして、もし最後まで読んで、更に次の行を読もうとした時には、readLineの値はnullになります。つまり、繰り返し構文などを使って次々とreadLineしていき、その値がnullになったら繰り返しを抜け出るようにすれば、全てのテキストが取りだせるというわけなのです。
○readLineと繰り返し処理○
while((rdata = br.readLine()) != null) {
alldata += rdata;
}
ここでは、繰り返し部分がこんな具合になってますね。whileというのは、その後の()部分がtrueである間、繰り返しを続けるというものです。では、()部分はどうなってるんでしょう?
まず「rdata = br.readLine()」というのがありますね? で、それが != null かどうか?っていうのを調べてます。ちょっとわかりにくいですが、これで「rdata = br.readLine()を実行し、その結果がnullでないかどうかチェックする」ということをまとめて行なっているんですね。
ファイルの読み込みではこんな書き方が多用されるということで使ってみました。まあ、これではちょっとわかりにくいので、「もうちょっと簡単にしたい」と思うなら以下のような感じにしてもよいでしょう。
while(true) {
rdata = br.readLine();
if (rdata == null) {
break;
}
alldata += rdata;
}
while()の部分にはtrueってのがありますね? こうしておくと「ずーっと永遠にくり返す」っていう繰り返しができます。で、読み込んだところで if (rdata == null) というのでチェックをし、もしnullだったら「break」を実行します。これは、構文を途中で終了し抜け出すものです。これで先の繰り返しと同じ処理ができます。
○改行コードの扱い○
ところで、このメソッド、実際に使ってみるとちょっと変なことに気がつくでしょう。それは「Readボタンで読み込むと、改行してあるテキストが全部つながって出てくる」ということです。
ここで使っているreadLine()というのは、1行ずつテキストを読み込むんですが、最後についている(はず)の改行コードを取り除いてくれるんです。このため、「alldata += rdata;」とすると、読み込んだ行が全部つながっちゃうんですね。もし「そんなのはイヤだ」という人は、この行の後に、
alldata += "\n";
この文を追加して下さい。"\n"ってのは、Characterクラスにある、改行の制御コードです。これを追加してやれば、ちゃんと改行された状態になります。
下に掲載したリストが読み込み処理のメソッドです。try構文をまず用意して、最初にFileDialogを使ってファイルのパスと名前を取り出すところまではほぼ同じです。が、そこから先が違います。
ファイルの読み込みは「Reader」というリーダーを使います。が、このReader、読み込むのがちょっと厄介なんです。読み込むための「read」というのは用意してありますが、これは1文字(charという値)しか読めません。まとめて読み込むものもあるんですが、それは「char配列」っていうものの値で取り出されるようになっていて「何文字分読め」って感じで読んでいかないといけないのです。
考えてみれば、書き出す時は、書くデータは最初から全部わかってます。けれど読む時は、そのファイルに何文字データがあるか、何行あるかなんてことはわかりません。どれだけデータがあるかわからない状態で、出たとこ勝負で読んでいくわけです。
○BufferedReaderクラス○
そこでテキストを読み込むときは、もう少し賢いリーダーとして用意されている「BufferedReader」というものを使うのが一般的です。これはパラメータにFileReaderを指定して作ります。
このBufferedReaderを使うと何が便利なのかというと、1行ずつStringでテキストを読むことができるのです。「readLine()」というメソッドがそれで、これを呼び出すことで1行のテキストを取り出すことができます。(今回は使ってませんが、書き出しにも、BufferdWriterというクラスがちゃんと用意されています)
そして、もし最後まで読んで、更に次の行を読もうとした時には、readLineの値はnullになります。つまり、繰り返し構文などを使って次々とreadLineしていき、その値がnullになったら繰り返しを抜け出るようにすれば、全てのテキストが取りだせるというわけなのです。
○readLineと繰り返し処理○
while((rdata = br.readLine()) != null) {
alldata += rdata;
}
ここでは、繰り返し部分がこんな具合になってますね。whileというのは、その後の()部分がtrueである間、繰り返しを続けるというものです。では、()部分はどうなってるんでしょう?
まず「rdata = br.readLine()」というのがありますね? で、それが != null かどうか?っていうのを調べてます。ちょっとわかりにくいですが、これで「rdata = br.readLine()を実行し、その結果がnullでないかどうかチェックする」ということをまとめて行なっているんですね。
ファイルの読み込みではこんな書き方が多用されるということで使ってみました。まあ、これではちょっとわかりにくいので、「もうちょっと簡単にしたい」と思うなら以下のような感じにしてもよいでしょう。
while(true) {
rdata = br.readLine();
if (rdata == null) {
break;
}
alldata += rdata;
}
while()の部分にはtrueってのがありますね? こうしておくと「ずーっと永遠にくり返す」っていう繰り返しができます。で、読み込んだところで if (rdata == null) というのでチェックをし、もしnullだったら「break」を実行します。これは、構文を途中で終了し抜け出すものです。これで先の繰り返しと同じ処理ができます。
○改行コードの扱い○
ところで、このメソッド、実際に使ってみるとちょっと変なことに気がつくでしょう。それは「Readボタンで読み込むと、改行してあるテキストが全部つながって出てくる」ということです。
ここで使っているreadLine()というのは、1行ずつテキストを読み込むんですが、最後についている(はず)の改行コードを取り除いてくれるんです。このため、「alldata += rdata;」とすると、読み込んだ行が全部つながっちゃうんですね。もし「そんなのはイヤだ」という人は、この行の後に、
alldata += "\n";
この文を追加して下さい。"\n"ってのは、Characterクラスにある、改行の制御コードです。これを追加してやれば、ちゃんと改行された状態になります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※テキスト読み込みのメソッド void readTextFromFile() { try { FileDialog fd = new FileDialog(this,"Select Text File.",FileDialog.LOAD); fd.setVisible(true); String fname = fd.getDirectory() + fd.getFile(); FileReader fr = new FileReader(fname); BufferedReader br = new BufferedReader(fr); String rdata; String alldata = ""; while((rdata = br.readLine()) != null) { alldata += rdata; } fr.close(); ta.setText(alldata); } catch(Exception e) { System.out.println(e); } }
※関連コンテンツ