テキストファイルから読み込んである加工をし,別のテキストファイルに書き込むプログラムを作ります。
前の課題で作成した mondai.txt のような構造がなく単純な行のあつまりのテキストファイルに、行番号を付けて保存することにします。
テキストファイルの読み書きを復習すると同時に同じ機能のプログラムを3つの違った様式で書いて比べます。
import java.io.*; public class AddNum { public static void main( String[] args ) { try { FileReader in = new FileReader("test00.txt"); BufferedReader inb = new BufferedReader(in); FileWriter out = new FileWriter("test01.txt"); BufferedWriter outb = new BufferedWriter(out); int ct =0; String line; while ((line = inb.readLine()) != null) { ct++; outb.write( ct + " " + line ); outb.newLine(); } outb.close(); out.close(); inb.close(); in.close(); } catch (IOException e) { System.err.println( "ファイルがないのでは?" ); } } }
プログラムの中のある部分を何度も使うときはその部分を副プログラム(サブルーチン)として独立させることがあります。C言語ではこれも関数とよびます。javaではこれもメソッドと呼びます。
今回のプログラムには何回も使っているところはないのですが,ファイル名を変えて同じことをしたいということは考えられますから,ファイル名を引数で与えてメソッドを呼び出すようにしておくのはよいことです。
import java.io.*; /** メソッドを使う */ public class AddNum2 { public void addNum( String ifname, String ofname ) { try { FileReader in = new FileReader(ifname); BufferedReader inb = new BufferedReader(in); FileWriter out = new FileWriter(ofname); BufferedWriter outb = new BufferedWriter(out); int ct =0; String line; while ((line = inb.readLine()) != null) { ct++; outb.write( ct + " " + line ); outb.newLine(); } outb.close(); out.close(); inb.close(); in.close(); } catch (IOException e) { System.err.println( ifname + " がないのでは?" ); } } public static void main( String[] args ) { AddNum2 job1 = new AddNum2(); job1.addNum("test00.txt","test02.txt"); } }
javaのプログラムはmainから開始されます。AddNum2というクラスのインスタンスを作って,名前をjob1とし,job1.addNum()で( )内にファイル名を指定して.addNumメソッドを呼び出しています。
AddNum2というクラスにはフィールドがありません。だから変数の型の拡張としてはとらえにくく,なんのために new でインスタンスを作らなければならないのか理解に苦しむと思います。でもこの書き方は許されています。
コンストラクタもありません。
メソッドの部分をコンストラクタにしてしまうとmainでjob1というインスタンスを作っただけですべての作業が進みます。mainが自分が書かれているクラスのインスタンスを作るというのは違和感があるかも知れません。しかしjavaではmainのあるクラスも他のクラスも区別なくmainから使うことができます。(publicのところを変えて使えないようにもできます)そのために、ファイル名とクラス名を一致させているのです。mainはプログラムを開始するスタートするためのメソッドです。
import java.io.*; /** コンストラクタを使う */ public class AddNum3 { public AddNum3( String ifname, String ofname ) { try { FileReader in = new FileReader(ifname); BufferedReader inb = new BufferedReader(in); FileWriter out = new FileWriter(ofname); BufferedWriter outb = new BufferedWriter(out); int ct =0; String line; while ((line = inb.readLine()) != null) { ct++; outb.write( ct + " " + line ); outb.newLine(); } outb.close(); out.close(); inb.close(); in.close(); } catch (IOException e) { System.err.println( ifname + " がないのでは?" ); } } public static void main( String[] args ) { AddNum3 job1 = new AddNum3("test00.txt","test03.txt"); } }
AddNum2.javaとAddNum3.javaでメソッドとコンストラクタの違いを比較してみましょう。
上記の AddNum.java をつくり実行してみなさい
適当なテキストファイル test00.txt を作って、実行し、test01.txt ができていることを確認しなさい。
test01.txtをエディタで開いて内容を確認しなさい。
上記の AddNum2.java AddNum3.java をつくり実行してみなさい
実行し、test02.txt test03.txt ができていることを確認しなさい。