Java: ¿cómo puedo escribir mi ArrayList en un archivo y leer (cargar) ese archivo en la ArrayList original?

Estoy escribiendo un progtwig en Java que muestra una variedad de clubes después de la escuela (EG Football, Hockey – ingresado por el usuario). Los clubes se agregan a la siguiente ArrayList :

 private ArrayList clubs = new ArrayList(); 

Por el siguiente método:

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

‘Club’ es una clase con un nombre de constructor:

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

Mi progtwig está funcionando: me permite agregar un nuevo Objeto Club en mi lista de arrays, puedo ver la lista de arrays, y puedo eliminar cualquiera que quiera, etc.

Sin embargo, ahora quiero guardar ese arrayList (clubs) en un archivo, y luego quiero poder cargar el archivo más tarde y el mismo arraylist está ahí nuevamente.

Tengo dos métodos para esto (ver más abajo), y he estado tratando de hacerlo funcionar, pero no he tenido ninguna suerte, cualquier ayuda o consejo sería apreciado.

Método de guardado (el nombre de archivo es elegido por el usuario)

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

Método de carga (el código actual no se ejecutará – ¿El archivo es una cadena pero debe ser 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); } 

También estoy usando una GUI para ejecutar la aplicación, y en este momento, puedo hacer clic en mi botón Guardar, que luego me permite escribir un nombre y ubicación y guardarlo. El archivo aparece y se puede abrir en el Bloc de notas, pero se muestra como Club @ c5d8jdj (para cada Club en mi lista)

Como ejercicio, sugeriría hacer lo siguiente:

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

Esto escribirá el nombre de cada club en una nueva línea en su archivo.

 Soccer Chess Football Volleyball ... 

Dejaré la carga para ti. Sugerencia : escribiste una línea a la vez, luego puedes leer una línea a la vez.

Cada clase en Java extiende la clase Object . Como tal, puedes anular sus métodos. En este caso, debería interesarse por el método toString() . En su clase Club , puede anularla para imprimir algún mensaje sobre la clase en el formato que desee.

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

Luego puede cambiar el código anterior 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(); } 

Debería usar el mecanismo de serialización incorporado de Java. Para usarlo, debes hacer lo siguiente:

  1. Declare que la clase Club implementa Serializable :

     public class Club implements Serializable { ... } 

    Esto le dice a la JVM que la clase se puede serializar en una transmisión. No tiene que implementar ningún método, ya que esta es una interfaz de marcador.

  2. Para escribir su lista en un archivo haga lo siguiente:

     FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(clubs); oos.close(); 
  3. Para leer la lista de un archivo, haga lo siguiente:

     FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); List clubs = (List) ois.readObject(); ois.close(); 

En Java 8 puede usar el método Files.write () con dos argumentos: Path y List , algo como esto:

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

Esto podría funcionar para usted

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

Para volver a leer puede tener

 public void read(String fileName) throws FileNotFoundException { FileInputStream fin= new FileInputStream (fileName); ObjectInputStream ois = new ObjectInputStream(fin); clubs= (ArrayList)ois.readObject(); fin.close(); } 
 ObjectOutputStream.writeObject(clubs) ObjectInputStream.readObject(); 

Además, la lógica ‘agregar’ es lógicamente equivalente a usar un conjunto en lugar de una lista. Las listas pueden tener duplicados y Sets no. Debes considerar usar un conjunto. Después de todo, ¿puedes tener 2 clubes de ajedrez en la misma escuela?