Ci sono molte classi che permettono di scrivere/leggere file di ogni tipo, BufferedReader/Writer, PrintWriter, classi per la scrittura e lettura di oggetti ...
Fai una ricerca su internet per vedere le varie differenze, io sono abituato a usare PrintWriter in scrittura e a leggere i file per riga con la classe BufferedReader, ma puoi fare in molti modi.
Scrivere e ricostruire un oggetto con più variabili non è immediato, per questo avevo linkato una discussione che ti desse una panoramica un po' generale.
Se usi un formato standard tra quelli citati il lavoro è già in gran parte svolto, ad esempio tramite la serializzazione è possibile scrivere e leggere un oggetto su file con poche righe di codice, e non devi preoccuparti praticamente di niente (cerca esempi in rete sull'uso della serializzazione degli oggetti).
Se vuoi scrivere tu un tuo file, ad esempio un file di testo, devi preoccuparti di come distinguire le varie informazioni per ricostruire l'oggetto, e la cosa può creare problemi.
Se hai campi (es. stringhe) di lunghezza fissa potresti anche pensare di scrivere tutto consecutivamente e poi spezzare la stringa che leggi nelle varie parti, oppure potresti usare un carattere di separazione tra le variabili, o scrivere una variabile per riga, etc...
Ma potresti trovarti in situazioni in cui il formato viene sballato dal fatto di avere un campo che contiene all'interno il carattere di separazione scelto, o se ci sono informazioni mancanti o quant'altro.
Per questo sarebbe meglio affidarsi a procedimenti già consolidati.
Tuttavia la scrittura/lettura/modifica di file è una skill importante da acquisire (almeno dal mio punto di vista), quindi all'inizio potresti far pratica con un semplice file di testo.
Ti posto sotto un esempio di scrittura e lettura di file, in cui memorizzo i dati relativi a Persone (nome e cognome) su righe diverse di un semplice file di testo.
Alcune note:
- Quando usi una classe di IO devi ricordarti di richiamare il metodo close sullo stream. Se non lo fai potresti avere diversi problemi, tra cui la creazione di un file vuoto ad esempio.
- L'utilizzo delle suddette classi può generare eccezioni (banalmente il percorso del file potrebbe essere invalido). Devi quindi dichiarare l'eccezione o gestirla esplicitamente in un blocco try-catch. In questo caso dovresti anche usare il blocco finally, per assicurarti che la risorsa sia chiusa in ogni caso.
- Da java 7 in poi puoi usare il costrutto try-with-resources (vedi metodo scriviPersona), che gestisce da solo la chiusura delle risorse inizializzate.
- In generale le classi che si occupano della scrittura di un file sovrascrivono un file precedente con lo stesso nome. Per evitare che ciò accada devi preoccupartene tu (controlla sempre la documentazione). Nel mio esempio il metodo aggiungiPersona passa al costruttore di PrintWriter un FileWriter a cui è stato specificato di usare la modalità "append" (con il parametro booleano).
- Generalmenete con BufferedReader si segue il procedimento che ho commentato nel codice, ovvero leggere una riga alla volta e fare qualcosa con la riga letta.
Nel mio esempio, visto che ipotizzo che il file sia scritto a blocchi di due righe (contenenti nome e cognome delle persone) seguo un approccio diverso in lettura, ma se il file è mal formato puoi andare incontro a diversi tipi di errore.
codice:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
public class TestFile
{
public static void main (String [] a) {
scriviPersona (new Persona ("Mario", "Rossi"), "Esempio.txt");
aggiungiPersona (new Persona ("Paolo", "Verdi"), "Esempio.txt");
leggiPersone ("Esempio.txt");
}
private static void scriviPersona (Persona persona, String path) {
try (PrintWriter writer = new PrintWriter (path)) {
writer.println (persona.getNome ());
writer.println (persona.getCognome ());
}
catch (Exception e) {
e.printStackTrace ();
}
}
private static void aggiungiPersona (Persona persona, String path) {
PrintWriter writer = null;
try {
writer = new PrintWriter (new FileWriter (path, true));
writer.println (persona.getNome ());
writer.println (persona.getCognome ());
}
catch (Exception e) {
e.printStackTrace ();
}
finally {
if (writer != null) writer.close ();
}
}
private static void leggiPersone (String path) {
ArrayList <Persona> persone = new ArrayList <Persona> ();
try (BufferedReader reader = new BufferedReader (new FileReader (path))) {
/* String line;
while ((line = reader.readLine ()) != null) {
// fai qualcosa con la linea letta, ad esempio la aggiungi ad una lista di stringhe per "memorizzare" l'intero file e poi elaborarlo o altro ...
} */
while (true) {
String nome = reader.readLine ();
String cognome = reader.readLine ();
if (nome == null || cognome == null) break;
else persone.add (new Persona (nome, cognome));
}
}
catch (Exception e) {
e.printStackTrace ();
}
System.out.println ("Lista di persone trovate nel file : " + System.lineSeparator () + persone);
}
}
class Persona
{
private String nome, cognome;
public Persona (String nome, String cognome) {
this.nome = nome;
this.cognome = cognome;
}
public String getNome () {
return nome;
}
public String getCognome () {
return cognome;
}
@Override public String toString () {
return nome + " " + cognome;
}
}
Ho messo molta carne al fuoco, prova però a cercare in internet le cose a cui ho fatto riferimento, poi se ci sono problemi siamo qui apposta !