行番号を加えて書き出す

ファイルを読んで加工して書き出す

テキストファイルから読み込んである加工をし,別のテキストファイルに書き込むプログラムを作ります。

前の課題で作成した mondai.txt のような構造がなく単純な行のあつまりのテキストファイルに、行番号を付けて保存することにします。

テキストファイルの読み書きを復習すると同時に同じ機能のプログラムを3つの違った様式で書いて比べます。

作業の順番に書く

ファイル名 AddNum.java

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ではこれもメソッドと呼びます。

今回のプログラムには何回も使っているところはないのですが,ファイル名を変えて同じことをしたいということは考えられますから,ファイル名を引数で与えてメソッドを呼び出すようにしておくのはよいことです。

ファイル名 AddNum2.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はプログラムを開始するスタートするためのメソッドです。

ファイル名 AddNum3.java

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でメソッドとコンストラクタの違いを比較してみましょう。

課題

1.

上記の AddNum.java をつくり実行してみなさい

ファイル名 AddNum.java

適当なテキストファイル test00.txt を作って、実行し、test01.txt ができていることを確認しなさい。

test01.txtをエディタで開いて内容を確認しなさい。

2.

上記の AddNum2.java AddNum3.java をつくり実行してみなさい

ファイル名 AddNum2.java

ファイル名 AddNum3.java

実行し、test02.txt test03.txt ができていることを確認しなさい。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified