テキストファイルからの読み込み
続いて、テキストファイルからテキストを読み込む処理についてです。これも、書き出しと同じように2つのクラスを使います。
FileReader――テキストファイルからString値を読み込むためのものです。
BufferedReader――ストリームにバッファ機能を付加するものです。
この2つも、基本的な使い方は書き出しのときとほぼ同じです。ざっと手順を整理しておきましょう。
1.まず、ファイル名を指定してFileReaderインスタンスを作成します。
2.作成したFileReaderをもとに、BufferedReaderインスタンスを作成します。
3.BufferedReaderにあるメソッドを使って、ファイルを読み込みString値として取り出します。
4.読み込み終わったら、closeメソッドを呼び出しストリームを開放します。
基本的な流れ自体はほとんど変わらないのですが、実は大きく異なる点が1つだけあります。それは、「読み込みの場合、どこまでテキストを読み込んだかを確認しながら、何度も読み込みを行わないといけない」という点です。テキストファイルの読み込みは、「ファイルの最後まで全部を一発で読み込む」ということはできないのです。できるのは「○○バイト読み込む」とか、「1行読み込む」というように、指定の部分を読み込むことだけ。ですから、テキストを読み込んでは「最後まで読み終えたか」をチェックし、まだ残っていたらまた読み込む……というように、読み込み作業を繰り返し行う必要があるのです。
では、この点を踏まえて、プログラムを作成してみましょう。先ほどのサンプルに、「起動したらファイルからテキストを読み込んでTextAreaに表示する」という機能を追加してみることにします。
package jp.allabout;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class SampleApp extends Frame {
TextArea area;
public SampleApp(){
this.setSize(new Dimension(300,200));
area = new TextArea();
this.add(area, BorderLayout.CENTER);
this.addWindowListener(new WindowMyAdapter());
this.loadFromFile(); // ★追加
}
public static void main(String[] args) {
new SampleApp().setVisible(true);
}
public void saveToFile(){
……略……
}
public void loadFromFile(){
String fname = "text_data.txt";
FileReader reader = null;
BufferedReader breader = null;
try {
reader = new FileReader(fname);
breader = new BufferedReader(reader);
String result = "";
String allString = "";
while((result = breader.readLine()) != null){
allString += result + "\n";
}
area.setText(allString);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
breader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class WindowMyAdapter extends WindowAdapter {
public void windowClosing(WindowEvent arg0) {
saveToFile();
System.exit(0);
}
}
}