テキストファイルに情報を追加しようとしていますが、ファイルには最後に書き込まれた要素しか表示されません。
Engineer
sは多数ありますが、読み取った最後の要素のみをファイルに出力します。
例えば:
Engineer e = new Engineer(firstName,surName,weeklySal);
PrintStream writetoEngineer = new PrintStream(new File ("Engineer.txt"));
//This is not append. Only print. Overwrites the file on each item.
writetoEngineer.append(e.toString() + " " + e.calculateMontly(weeklySal));
ファイルを閉じている場所がわかりません。何も読んでいないようです。
毎回上書きするのではなく、ファイルに追加したいと思います。その場合、これはデフォルトの動作ではないため、FileOutputStreamの追加オプションを使用する必要があります。
_PrintStream writetoEngineer = new PrintStream(
new FileOutputStream("Engineer.txt", true));
_
ところで:e.toString() + " "
は、eがnullの場合に例外をスローしないことを除いて、_e + " "
_とほとんど同じです。
コードスニペットのコードは自己完結型のコンパイル例ではないため(単純ですが)、エンジニアコレクションの反復ごとにPrintStreamがループ内に作成されると推測できます。これにより、PrintStreamのコンストラクターjavadocに示されているように、ファイルが切り捨てられます。
パラメーター:
file-この印刷ストリームの宛先として使用するファイル。ファイルが存在する場合は、サイズがゼロに切り捨てられます。それ以外の場合は、新しいファイルが作成されます。出力はファイルに書き込まれ、バッファリングされます。
このサンプルコードを試してください:
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.PrintStream;
import Java.util.ArrayList;
import Java.util.List;
public class PrintEngineers {
public static class Engineer {
private final String firstName;
private final String surName;
private final int weeklySal;
public Engineer(String firstName, String surName, int weeklySal) {
super();
this.firstName = firstName;
this.surName = surName;
this.weeklySal = weeklySal;
}
public int calculateMonthly() {
return weeklySal * 4; // approximately
}
@Override
public String toString() {
return firstName + " " + surName;
}
}
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
Engineer e1 = new Engineer("first1", "sur1", 100);
Engineer e2 = new Engineer("first2", "sur2", 200);
Engineer e3 = new Engineer("first3", "sur3", 300);
List<Engineer> engineers = new ArrayList<>(3);
engineers.add(e1);
engineers.add(e2);
engineers.add(e3);
// instanciate PrintStream here, before the loop starts
PrintStream writetoEngineer = new PrintStream(new File("Engineer.txt"));
for (Engineer engineer : engineers) {
// new PrintStream(...) here truncates the file (see javadoc) //This is not append.Only print.Refresh file on each item
writetoEngineer.append(engineer.toString()).append(' ')
.append("" + engineer.calculateMonthly()).append('\n');
}
}
}