ファイルから読み出すだけでなく、ファイルに書き出してみます。
前の課題で作成した mondai.txt から問題と正解を取り出して,mondaio.txt に書き出しすことにします。ファイル名は似ていますが変えてあります。
Q.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? 1.メソッド 2.インスタンス 3.コンスタンス A.1 Q.例外処理でtryとともに用いられるものは? 1.error 2.while 3.catch A.3
これを次のように内容を変えて書き出します。
1.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? メソッド 2.例外処理でtryとともに用いられるものは? catch
いろいろな方法がありますが、Mondaishuuクラスはそのまま使って、Mondai.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クラスに書き出し機能を加えて、MondaiSeikai.java の代わりに、MondaiSeikai2.java を作ります。MondaiSeikai2.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を書きます。
import java.io.*; public class MondaiSeikai2 { public static void main( String[] args ) { Mondaishuu m1 = new Mondaishuu("mondai.txt",10); m1.seikaiNote("mondaio2.txt"); } }
上記の MondaiSeikai.java をつくり実行してみなさい
mondai.txtのほかにmondaio.txtができていることを確認しなさい。
mondaio.txtをエディタで開いて内容を確認しなさい。
上記のようにMondaiShuu.java にメソッドを書き加え, MondaiSeikai2.java をつくり実行してみなさい
できるファイルは MondaiSeikai.javaと同じです。mondaio2.txtの内容はmondaio.txtとおなじです。