2013-04-19 7 views
16

Sto scrivendo un programma in Java che visualizza una gamma di club doposcuola (E.G. Calcio, Hockey - inserito dall'utente). I club sono aggiunti nelle seguenti ArrayList:Java - Come posso scrivere il mio ArrayList su un file e leggere (caricare) quel file sull'ArrayList originale?

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

con il metodo followng:

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

'Club' è una classe con un costruttore - nome:

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

mio il programma sta funzionando - mi permette di aggiungere un nuovo oggetto Club al mio arraylist, posso visualizzare l'arraylist e posso cancellare qualsiasi cosa voglio ecc.

Tuttavia, ora voglio salvare quell'arrayList (bastoni) in un file, e poi voglio essere in grado di caricare il file più tardi e lo stesso arraylist è di nuovo lì.

Ho due metodi per questo (vedi sotto), e ho cercato di farlo funzionare, ma non ha avuto nulla, qualsiasi aiuto o consiglio sarebbe apprezzato.

metodo di salvataggio (nome del file è scelto dall'utente)

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

metodo Load (codice corrente solito gestito - File è una stringa, ma ha bisogno di essere Club

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

Sono anche utilizzando un? GUI per eseguire l'applicazione, e al momento, posso fare clic sul mio pulsante Salva che poi mi permette di digitare un nome e posizione e salvarlo.Il file appare e può essere aperto in Blocco note ma visualizza come qualcosa come Club @ c5d8jdj (per ogni Club nella mia lista)

.210
+0

Quello che si vede 'Club @ c5d8jdj' è il risultato del metodo' 'toString()' della classe Object. Come vorresti che la lista venisse salvata nel file? Quale formato? –

+0

toString() non è adatto per la scrittura su file. Vuoi la serializzazione. – Aurand

+0

Se si desidera eseguire questa operazione, è necessario sovrascrivere il metodo toString() della classe Club() in modo che contenga tutte le informazioni e quindi un Costruttore, che sia in grado di ricreare l'oggetto. Oppure dai un'occhiata all'interfaccia Serializable e ObjectStreams: http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html – NeplatnyUdaj

risposta

8

Come esercizio, vorrei suggerire di fare quanto segue:

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

Questo scriverà il nome di ogni club in una nuova riga nel file.

Soccer 
Chess 
Football 
Volleyball 
... 

Lascio il carico a voi. Suggerimento:: hai scritto una riga alla volta, puoi quindi leggere una riga alla volta.

Ogni classe in Java estende la classe Object. In quanto tale è possibile sovrascrivere i suoi metodi. In questo caso, si dovrebbe essere interessati dal metodo toString(). Nella tua classe Club, puoi sovrascriverla per stampare un messaggio sulla classe in qualsiasi formato desideri.

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

È quindi possibile cambiare il codice di cui sopra a:

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

per un piccolo set di dati, sembra essere ok ma dubito fortemente che sia efficiente dato un enorme set di dati. –

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

Inoltre, è 'aggiungere' logica è logicamente equivalente a utilizzando un insieme invece di una lista. Gli elenchi possono avere duplicati e gli insiemi non possono. Dovresti prendere in considerazione l'utilizzo di un set. Dopotutto, puoi davvero avere 2 club di scacchi nella stessa scuola?

2

Questo potrebbe funzionare per voi

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

di leggere di nuovo si può avere

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

si dovrebbe usare Java incorporato nel meccanismo di serializzazione. Per utilizzarlo, è necessario effettuare le seguenti operazioni:

  1. dichiarare la classe Club come attuazione Serializable:

    public class Club implements Serializable { 
        ... 
    } 
    

    Questo dice la JVM che la classe può essere serializzata in un flusso. Non è necessario implementare alcun metodo, poiché questa è un'interfaccia marcatore.

  2. di scrivere il vostro elenco in un file procedere come segue:

    FileOutputStream fos = new FileOutputStream("t.tmp"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(clubs); 
    oos.close(); 
    
  3. Per leggere l'elenco da un file, effettuare le seguenti operazioni:

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

Perfetto ... Grazie – Noman

+0

Se si ottiene un'eccezione "File system di sola lettura", è possibile modificare '" t.tmp "' in 'file', dove' File file = new File (getFilesDir(), "t .tmp ");' o 'File file = new File (getExternalFilesDir (null)," t.tmp ");' ma quest'ultimo potrebbe necessitare dell'autorizzazione 'WRITE_EXTERNAL_STORAGE'. –

+1

Questo è il metodo corretto. –

2

In Java 8 voi possibile utilizzare il metodo Files.write() con due argomenti: Path e List<String>, qualcosa del genere:

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