私はJavaのプログラムを書いています。これは放課後クラブ(E.G.フットボール、ホッケー-ユーザーが入力)を表示します。クラブは次のArrayList
に追加されます。
private ArrayList<Club> clubs = new ArrayList<Club>();
次の方法で:
public void addClub(String clubName) {
Club club = findClub(clubName);
if (club == null)
clubs.add(new Club(clubName));
}
「クラブ」はコンストラクターを持つクラスです-名前:
public class Club {
private String name;
public Club(String name) {
this.name = name;
}
//There are more methods in my program but don't affect my query..
}
私のプログラムは機能しています-新しいクラブオブジェクトをアレイリストに追加し、アレイリストを表示したり、必要なものを削除したりできます。
ただし、そのarrayList(クラブ)をファイルに保存し、そのファイルを後でロードできるようにしたいのですが、同じarraylistが再び存在します。
これには2つの方法があり(以下を参照)、機能させることを試みていますが、運がなかったので、助けやアドバイスをいただければ幸いです。
保存方法(fileNameはユーザーが選択します)
public void save(String fileName) throws FileNotFoundException {
String tmp = clubs.toString();
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
pw.write(tmp);
pw.close();
}
ロード方法(現在のコードは実行されません-ファイルは文字列ですが、クラブである必要がありますか?
public void load(String fileName) throws FileNotFoundException {
FileInputStream fileIn = new FileInputStream(fileName);
Scanner scan = new Scanner(fileIn);
String loadedClubs = scan.next();
clubs.add(loadedClubs);
}
また、GUIを使用してアプリケーションを実行していますが、現時点では[保存]ボタンをクリックして、名前と場所を入力して保存することができます。ファイルが表示され、メモ帳で開くことができますが、Club @ c5d8jdjのように表示されます(リスト内の各クラブについて)
演習として、次のことをお勧めします。
_public void save(String fileName) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
for (Club club : clubs)
pw.println(club.getName());
pw.close();
}
_
これにより、各クラブの名前がファイルの新しい行に書き込まれます。
_Soccer Chess Football Volleyball ...
_
ロードはあなたにお任せします。 ヒント:一度に1行ずつ書いたので、一度に1行ずつ読むことができます。
JavaのすべてのクラスはObject
クラスを拡張します。そのため、そのメソッドをオーバーライドできます。この場合、toString()
メソッドに関心があるはずです。 Club
クラスでは、このクラスをオーバーライドして、クラスに関するメッセージを任意の形式で出力できます。
_public String toString() {
return "Club:" + name;
}
_
その後、上記のコードを次のように変更できます。
_public void save(String fileName) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
for (Club club : clubs)
pw.println(club); // call toString() on club, like club.toString()
pw.close();
}
_
Javaの組み込みシリアル化メカニズムを使用する必要があります。それを使用するには、次のことを行う必要があります。
Club
クラスをSerializable
の実装として宣言します。
public class Club implements Serializable {
...
}
これは、クラスをストリームにシリアル化できることをJVMに伝えます。これはマーカーインターフェイスであるため、メソッドを実装する必要はありません。
リストをファイルに書き込むには、次の手順を実行します。
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(clubs);
oos.close();
ファイルからリストを読み取るには、次の手順を実行します。
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
List<Club> clubs = (List<Club>) ois.readObject();
ois.close();
Java 8では、 Files.write() メソッドを2つの引数で使用できます:Path
およびList<String>
、 このようなもの:
List<String> clubNames = clubs.stream()
.map(Club::getName)
.collect(Collectors.toList())
try {
Files.write(Paths.get(fileName), clubNames);
} catch (IOException e) {
log.error("Unable to write out names", e);
}
これはあなたのために働くかもしれません
public void save(String fileName) throws FileNotFoundException {
FileOutputStream fout= new FileOutputStream (fileName);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(clubs);
fout.close();
}
読み返すには
public void read(String fileName) throws FileNotFoundException {
FileInputStream fin= new FileInputStream (fileName);
ObjectInputStream ois = new ObjectInputStream(fin);
clubs= (ArrayList<Clubs>)ois.readObject();
fin.close();
}
ObjectOutputStream.writeObject(clubs)
ObjectInputStream.readObject();
また、「追加」ロジックは、リストの代わりにセットを使用することと論理的に同等です。リストには重複があり、セットには重複がありません。セットの使用を検討する必要があります。結局のところ、あなたは本当に同じ学校に2つのチェスクラブを持つことができますか?