ファイルに出力

ファイルに書き出す

ファイルから読み出すだけでなく、ファイルに書き出してみます。

前の課題で作成した mondai.txt から問題と正解を取り出して,mondaio.txt に書き出しすことにします。ファイル名は似ていますが変えてあります。

ファイル名 mondai.txt (前回作成した)

Q.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは?
1.メソッド
2.インスタンス
3.コンスタンス
A.1

Q.例外処理でtryとともに用いられるものは?
1.error
2.while
3.catch
A.3

これを次のように内容を変えて書き出します。

ファイル名 mondaio.txt (プログラムで作成する)

1.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは?
  メソッド
2.例外処理でtryとともに用いられるものは?
  catch

Mondai.java を元に

いろいろな方法がありますが、Mondaishuuクラスはそのまま使って、Mondai.java を MondaiSeikai.java に作りかえます

ファイル名 MondaiSeikai.java (コンパイルして実行)

import java.io.*;
public class MondaiSeikai {
    public static void main( String[] args ) {
        Mondaishuu m1 = new Mondaishuu("mondai.txt",10);
        String s = "";
        try {
           FileWriter     out  = new FileWriter("mondaio.txt");
           BufferedWriter outb = new BufferedWriter(out);
           for (int n=0;n<m1.mondaisu;n++){
              outb.write(n+1 + "." + m1.toi[n].question);
              outb.newLine();
              if (m1.toi[n].seikai==1){s = m1.toi[n].ans1;}
              if (m1.toi[n].seikai==2){s = m1.toi[n].ans2;}
              if (m1.toi[n].seikai==3){s = m1.toi[n].ans3;}
              outb.write("  " + s.substring(2));
              outb.newLine();
            }
            outb.close();
            out.close();
         }
         catch(Exception e){
                System.err.println( e);
         }
    }
}

実行するとこのようになります。

$ java MondaiSeikai
-0
-1
読込終了。

画面への表示ではこれしかでませんが,mondaio.txt ができています。。

FileWriterを上記のように使うと、同名のファイルがあると内容が書き換えられてしまいます。同名ファイルがあるときに警告するようにしたければ別途ファイルがあるかをチェックするところから自分で書く必要があります。

次のようにすると、同名のファイルがあるときには内容を追加にすることができます。

           FileWriter     out  = new FileWriter("mondaio.txt",true );

BufferedWriter は、ファイルの内容がある程度たまってからまとめて書くという役割をしますが、これを使うと .newLine() も使えるようになります。改行のコードがOSにより異なるので、それに合わせて改行をしてくれます。画面表示の System.out.println() に相当します。

ファイルを書き込むときには、.close() は特に大切です。これを書き忘れると、ファイルの内容が記録されない場合があります。

Mondaishuuクラスに書き出し機能を加える

プログラムのやり方はたくさんあります。同じ結果を得るために他のやり方をしてみましょう。

Mondaishuuクラスに書き出し機能を加えて、MondaiSeikai.java の代わりに、MondaiSeikai2.java を作ります。MondaiSeikai2.java では内容がすごく見やすくなります。

ファイル名 MondaiShuu.java (コンパイルのみ)

すでにある MondaiShuu.java に、強調している部分を書き加えます。以下の部分をそのまま置き換えてしまうと動かなくなりますので注意。seikaiNote( String fname )というメソッドをMondaiShuuというクラスの中に書き加えるのです。

    //メソッド
    public String check( int n, int ans ){
        if (toi[n].seikai == ans ){
           seikaict++;
           return "○";
        }
        else{
           gotouct++;
           return "×";
        }
    }  // ここが check( int n, int ans ) というメソッドの終わり
    public void seikaiNote( String fname ){
        try {
           String s = "";
           FileWriter     out  = new FileWriter(fname);
           BufferedWriter outb = new BufferedWriter(out);
           for (int n=0;n<mondaisu;n++){
              outb.write(n+1 + "." + toi[n].question);
              outb.newLine();
              if (toi[n].seikai==1){s = toi[n].ans1;}
              if (toi[n].seikai==2){s = toi[n].ans2;}
              if (toi[n].seikai==3){s = toi[n].ans3;}
              outb.write("  " + s.substring(2));
              outb.newLine();
            }
            outb.close();
            out.close();
        }
        catch(Exception e){
            System.err.println( e);
        }
    }  // ここが seikaiNote( String fname ) というメソッドの終わり
} //ここがMondaiShuuというクラスの終わりの中括弧

この変更は、MondaiSeikai.java に影響を与えません。変更後もこのまま使えます。

そして新しいメソッド .seikaiNote を使うMondaiSeikai2.javaを書きます。

ファイル名 MondaiSeikai2.java (コンパイルして実行)

import java.io.*;
public class MondaiSeikai2 {
    public static void main( String[] args ) {
        Mondaishuu m1 = new Mondaishuu("mondai.txt",10);
        m1.seikaiNote("mondaio2.txt");
    }
}

課題

1.

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

ファイル名 MondaiSeikai.java

mondai.txtのほかにmondaio.txtができていることを確認しなさい。

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

2.

上記のようにMondaiShuu.java にメソッドを書き加え, MondaiSeikai2.java をつくり実行してみなさい

ファイル名 MondaiShuu.java (ファイルの書き加えとコンパイルのみ)

ファイル名 MondaiSeikai2.java

できるファイルは MondaiSeikai.javaと同じです。mondaio2.txtの内容はmondaio.txtとおなじです。

もくじ

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