以前テキストファイルの読み込み処理を作りました。しかしmain関数に直接書いただけであったのでメソッドにして再利用できるようにしたいと思います。書き込みについては前回メソッドにしてあるのでこれに合わせたいと思います。
インタフェースを考える
mainメソッドに記述した内容は以下のようなものでした。
public static void main(String[] args) throws FileNotFoundException, IOException{ BufferedReader reader = new BufferedReader(new FileReader("/Users/myaccount/haiku.txt")); while(reader.ready()){ System.out.println(reader.readLine()); } reader.close(); }
また書き出しメソッドでは書き出すテキストを文字列配列にしてメソッドに渡していました。
public void printText(String filePath, String[] text)
読み込みではこれに合わせて文字列配列で返そうと思います。
public String[] readText(String filePath)
しかし一点問題があります。というのも配列はあらかじめ長さを決めて定義しなければいけないのですがファイルの行数がどのくらいかは最後まで読み込まないとわかりません。一度最後までファイルの中身を調べて行数を確認してからもう一度開き直して読み込んでも良いのですが二回もファイルを読み直すのは避けたいです。
そこで配列の代わりに可変の長さで配列のようにデータを保持できるArrayListというクラスを使います。使い方は以下の通りです。
ArrayList<String> list = new ArrayList<>(); list.add("hello"); list.add("goodbye"); String[] text = list.toArray(new String[]{});
このaddメソッドを好きなだけ呼べるので通常の配列と違い長さが変わる場合にも対応できます。ファイルの行数がどのくらいかわからなくてもこれで対応できます。
またtoArrayメソッドで配列にすることもできます。この時に空の配列を引数で渡すのは戻り値の配列の型を指定するためのものです。ここではStringクラスの配列にしたいのでその空の配列を引数で渡します。
実装する
実装に必要な部品が揃いましたのでインタフェースに沿って実装します。
public String[] readText(String filePath) throws IOException { ArrayList list = new ArrayList<>(); BufferedReader reader = new BufferedReader(new FileReader(filePath)); while (reader.ready()) { list.add(reader.readLine()); } reader.close(); return list.toArray(new String[]{}); }
前回書き出したファイルを読むようにmainメソッドで実行内容を記述します。処理はファイルを読み込んで1行ずつ標準出力に出力する内容です。クラス名はFileUtilとしました。
public static void main(String[] args) throws IOException { FileUtil util = new FileUtil(); String[] text = util.readText("/Users/myaccount/iroha.txt"); for(String line:text){ System.out.println(line); } };
以下実行結果です。ファイルの内容が書き出されました。
いろはにほへと ちりぬるを わかよなれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす
以下完成したFileUtilクラスになります。
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; public class FileUtil { public void printText(String filePath, String[] text) throws FileNotFoundException { PrintStream stream = new PrintStream(filePath); for (int i = 0; i < text.length; i++) { stream.println(text[i]); } stream.flush(); stream.close(); } public String[] readText(String filePath) throws IOException { ArrayList list = new ArrayList<>(); BufferedReader reader = new BufferedReader(new FileReader(filePath)); while (reader.ready()) { list.add(reader.readLine()); } reader.close(); return list.toArray(new String[]{}); } public static void main(String[] args) throws IOException { FileUtil util = new FileUtil(); String[] text = util.readText("/Users/myaccount/iroha.txt"); for(String line:text){ System.out.println(line); } } }