texto - modificar archivos txt en java
Java: ¿Cómo puedo escribir mi ArrayList en un archivo y leer(cargar) ese archivo en el ArrayList original? (5)
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 ...
Te dejo la carga a ti. Sugerencia : usted escribió una línea a la vez, luego puede 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 interesarle el método toString()
. En su clase Club
, puede anularlo para imprimir algún mensaje sobre la clase en el formato que desee.
public String toString() {
return "Club:" + name;
}
A continuación, 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();
}
Estoy escribiendo un programa en Java que muestra una variedad de clubes después de la escuela (por ejemplo, Fútbol, Hockey, ingresados por el usuario). Los clubes se agregan a la siguiente ArrayList
:
private ArrayList<Club> clubs = new ArrayList<Club>();
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 constructor - nombre:
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 programa está funcionando; me permite agregar un nuevo objeto de club en mi lista de elementos, puedo ver la lista de elementos y puedo eliminar lo que quiera, etc.
Sin embargo, ahora quiero guardar esa arrayList (clubes) en un archivo, y luego quiero poder cargar el archivo más tarde y la misma lista de arrays está ahí nuevamente.
Tengo dos métodos para esto (ver más abajo), y he estado tratando de que funcione, pero no he tenido ninguna suerte, cualquier ayuda o consejo sería apreciado.
Guardar método (fileName 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 ejecuta. ¿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 el botón Guardar que me permite escribir un nombre y una ubicación y guardarlos. El archivo aparece y se puede abrir en el Bloc de notas pero se muestra como algo como Club @ c5d8jdj (para cada Club en mi lista)
Debe utilizar el mecanismo de serialización incorporado de Java. Para usarlo, necesitas hacer lo siguiente:
Declare la clase
Club
como implementableSerializable
:public class Club implements Serializable { ... }
Esto le dice a la JVM que la clase puede ser serializada a un flujo. No es necesario implementar ningún método, ya que esta es una interfaz de marcador.
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();
Para leer la lista de un archivo, haga lo siguiente:
FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); List<Club> clubs = (List<Club>) ois.readObject(); ois.close();
En Java 8 puedes usar el método Files.write() con dos argumentos: Path
y List<String>
, algo como esto:
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);
}
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 puedes tener
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();
Además, la lógica de ''agregar'' es lógicamente equivalente a usar un Conjunto en lugar de una Lista. Las listas pueden tener duplicados y los conjuntos no pueden. Deberías considerar usar un set. Después de todo, ¿puedes realmente tener 2 clubes de ajedrez en la misma escuela?