2013-04-19 15 views
16

私は、アフタースクール・クラブ(E.G.サッカー、ホッケー - ユーザーが入力)の範囲を表示するJavaでプログラムを書いています。Java - My ArrayListをファイルに書き込み、そのファイルを元のArrayListに読み込む(ロードする)方法はありますか

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に追加されています:

private ArrayList<Club> clubs = new ArrayList<Club>(); 

followng方法で名前

public void addClub(String clubName) { 
    Club club = findClub(clubName); 
    if (club == null) 
     clubs.add(new Club(clubName)); 
} 

クラブ」はコンストラクタを持つクラスですプログラムが動作しています - 私はarraylistに新しいクラブオブジェクトを追加できます。私はarraylistを見ることができます。そして、私が好きなものは削除できます。

しかし、今はarrayList(clubs)をファイルに保存しておきたいのですが、後でファイルをロードできるようにしたいのですが、同じarraylistがもう一度存在します。

私はこれについて2つの方法を持っており、それを稼働させようとしていますが、どんな助けや助言もありました。

保存方法(ファイル名は、ユーザによって選択されている)

public void save(String fileName) throws FileNotFoundException { 
    String tmp = clubs.toString(); 
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
    pw.write(tmp); 
    pw.close(); 
} 

Loadメソッド(現在のコード文句を言わない実行 - ?ファイルは文字列ですが、クラブにする必要がある

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私のリストの各クラブについて)

+0

'Club @ c5d8jdj'はObjectクラスの' toString() 'メソッドの結果です。リストをファイルにどのように保存したいですか?どのような形式ですか? –

+0

toString()はファイルへの書き込みには適していません。シリアライゼーションが必要です。 – Aurand

+0

このようにするには、すべての情報が含まれるようにClub()クラスのtoString()メソッドをオーバーライドしてから、オブジェクトを再作成できるコンストラクタをオーバーライドする必要があります。または、SerializableインタフェースとObjectStreamを参照してください。http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

答えて

8

練習として、私は次のようやってお勧めします:

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(); 
} 
+0

小さなデータセットの場合、それは大丈夫と思われるが、私は非常にその巨大なデータセットを与えられた効率的なことを疑う。 –

0
ObjectOutputStream.writeObject(clubs) 
ObjectInputStream.readObject(); 

リストの代わりに設定してください。リストには重複があり、セットにはできません。セットの使用を検討する必要があります。結局、あなたは本当に同じ学校に2つのチェスクラブを持つことができますか?

2

これは、あなたがJavaの直列化機構に組み込まれたを使用する必要があります

public void read(String fileName) throws FileNotFoundException { 
FileInputStream fin= new FileInputStream (fileName); 
ObjectInputStream ois = new ObjectInputStream(fin); 
clubs= (ArrayList<Clubs>)ois.readObject(); 
fin.close(); 
} 
55

を持つことができますリードバックするには、あなたのため

public void save(String fileName) throws FileNotFoundException { 
FileOutputStream fout= new FileOutputStream (fileName); 
ObjectOutputStream oos = new ObjectOutputStream(fout); 
oos.writeObject(clubs); 
fout.close(); 
} 

を働くかもしれません。 がそれを使用するには、次の操作を行う必要があります。

  1. Serializableを実装するようClubクラスを宣言します。

    public class Club implements Serializable { 
        ... 
    } 
    

    は、このクラスがストリームにシリアライズすることができますJVMに指示します。これはマーカーインターフェイスなので、メソッドを実装する必要はありません。

  2. は、ファイルにリストを書き込むには次のようにします。

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. ファイルからリストを読み込むには、次の手順を実行します。Java 8あなたは

    FileInputStream fis = new FileInputStream("t.tmp"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    List<Club> clubs = (List<Club>) ois.readObject(); 
    ois.close(); 
    
+0

パーフェクト...ありがとう – Noman

+0

"読み取り専用ファイルシステム"例外が発生した場合、 '' t.tmp ''を' file'に変更できます。 'File file = new File(getFilesDir()、t .tmp ");'または 'File file = new File(getExternalFilesDir(null)、" t.tmp ");'ですが、後者は 'WRITE_EXTERNAL_STORAGE'アクセス権が必要な場合があります。 –

+1

これは正しい方法です。 –

2

2つの引数:PathList<String>を持つFiles.write()メソッドを使用すると、次のようになります。

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); 
} 
関連する問題