2013-04-19 9 views
16

Ich schreibe ein Programm in Java, das eine Reihe von Nachschülerklubs anzeigt (E.G. Football, Hockey - vom Benutzer eingegeben). Die Clubs hinzugefügt werden in den folgenden ArrayList:Java - Wie kann ich meine ArrayList in eine Datei schreiben und diese Datei in die ursprüngliche ArrayList laden (laden)?

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

Durch die followng Methode:

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

'Club' ist eine Klasse mit einem Konstruktor - Name:

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.. 
} 

Meine Programm funktioniert - es lässt mich ein neues Club-Objekt in meine Arraylist hinzufügen, ich kann die Arraylist, und ich kann löschen, was ich will etc.

Allerdings möchte ich jetzt diese ArrayList (Vereine) in eine Datei speichern, und dann möchte ich in der Lage sein, die Datei später zu laden und die gleiche Arraylist ist wieder da.

Ich habe zwei Methoden dafür (siehe unten), und habe versucht, es funktioniert zu bekommen, aber havent hatte jeden luck, jede Hilfe oder Beratung wäre willkommen.

Methode speichern (Dateiname durch den Benutzer ausgewählt wird)

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

Load-Methode (Aktuelle Code wird nicht ausgeführt - Datei ein String ist, aber im Club sein muss

public void load(String fileName) throws FileNotFoundException { 
    FileInputStream fileIn = new FileInputStream(fileName); 
    Scanner scan = new Scanner(fileIn); 
    String loadedClubs = scan.next(); 
    clubs.add(loadedClubs); 
} 

ich auch verwende? GUI, um die Anwendung zu starten, und im Moment kann ich auf meine Speichern Schaltfläche klicken, die es mir erlaubt, einen Namen und einen Speicherort einzugeben und zu speichern. Die Datei erscheint und kann im Editor geöffnet werden, wird aber als Club @ c5d8jdj angezeigt. für jeden Club in meiner Liste)

+0

Was Sie sehen 'Club @ c5d8jdj' ist das Ergebnis der Methode 'toString()' der Object-Klasse. Wie möchten Sie, dass die Liste in der Datei gespeichert wird? Welches Format? –

+0

toString() ist nicht zum Schreiben in eine Datei geeignet. Sie möchten Serialisierung. – Aurand

+0

Wenn Sie dies auf diese Weise tun möchten, müssen Sie die toString() -Methode der Klasse Club() überschreiben, sodass sie alle Informationen enthält, und dann einen Konstruktor, der das Objekt neu erstellen kann. Oder werfen Sie einen Blick auf Serializable-Schnittstelle und ObjectStreams: http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

Antwort

8

Als Übung, würde ich vorschlagen, die folgenden Aktionen ausführen:

public void save(String fileName) throws FileNotFoundException { 
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
    for (Club club : clubs) 
     pw.println(club.getName()); 
    pw.close(); 
} 

Dies wird den Namen jeden Verein auf eine neue Zeile in der Datei schreiben.

Soccer 
Chess 
Football 
Volleyball 
... 

werde ich den Laden verlassen Sie. Tipp: Sie haben jeweils eine Zeile geschrieben, Sie können dann Zeile für Zeile lesen. Alle Klassen in Java erweitern die Klasse Object. So können Sie seine Methoden überschreiben. In diesem Fall sollten Sie an der Methode toString() interessiert sein. In Ihrer Klasse Club können Sie sie überschreiben, um eine Nachricht über die Klasse in einem beliebigen Format zu drucken.

public String toString() { 
    return "Club:" + name; 
} 

Sie könnten dann den obigen Code ändern:

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

für einen kleinen Datensatz, es scheint in Ordnung zu sein, aber ich bezweifle sehr, dass es effizient ist angesichts einer großen Datenmenge. –

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

Auch Sie 'add' Logik ist logisch äquivalent ein Set anstelle einer Liste zu verwenden. Listen können Duplikate und Sätze nicht enthalten. Sie sollten überlegen, ein Set zu verwenden. Können Sie wirklich 2 Schachclubs in derselben Schule haben?

2

Dies könnte für arbeiten Sie

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

zurück zu lesen Sie

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

Sie sollten in Serialisierungsmechanismus gebaut verwenden Java haben. es nutzen zu können, müssen Sie Folgendes tun:

  1. Deklarieren Sie die Club Klasse als Implementierung Serializable:

    public class Club implements Serializable { 
        ... 
    } 
    

    Dies teilt der JVM, die die Klasse kann in einen Stream serialisiert werden. Sie müssen keine Methode implementieren, da dies eine Marker-Schnittstelle ist.

  2. Um Ihre Liste in einer Datei gehen Sie wie folgt zu schreiben:

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. Um die Liste aus einer Datei zu lesen, gehen Sie wie folgt vor:

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

Perfect ... Danke – Noman

+0

Wenn Sie eine "Read-only Dateisystem" Ausnahme erhalten, können Sie '" t.tmp "' in 'Datei' ändern, wobei' Datei Datei = neue Datei (getFilesDir(), "t .tmp ");' oder 'Datei datei = neue Datei (getExternalFilesDir (null)," t.tmp ");' aber letzteres benötigt möglicherweise die Berechtigung 'WRITE_EXTERNAL_STORAGE'. –

+1

Dies ist die korrekte Methode. –

2

In Java 8 Sie kann Files.write() Methode mit zwei Argumenten verwenden: Path und List<String>, etwas wie dieses:

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); 
} 
Verwandte Themen