Lettura e scrittura di file di testo Linguaggi Java Lettura e scrittura di file di testo Per il trattamento dei file di testo Java mette a disposizione la la classe java.io.File che è una rappresentazione astratta di un file o di una directory e mette a disposizione alcuni metodi molto utili come sapere se il file esiste, cancellarlo, rinominarlo, …. Il costruttore della classe File riceve in input una stringa contenente il path del file. La creazione di un’istanza di File non genera la creazione fisica del file sul disco fisso ma per crearlo fisicamente occorre chiamare il metodo createNewFile(); I metodi principali della classe File sono i seguenti: exists() – che restituisce true se il file esiste, false altrimenti. createNewFile() – che crea effettivamente il file sul disco. delete() – che elimina il file dal disco. mkDir() – che permette di creare una directory. lastModified() – restituisce l’ora dell’ultima modifica L’accesso ai file si realizza in modo molto simile a quello della lettura di righe da tastiera: un file di testo infatti è una sequenza di byte che dobbiamo riuscire a guardare come una stringa utilizzando alcune classi presenti nella libreria java.io. La classe FileReader ereditata da InputStreamReader è il centro della lettura di un file: una volta ottenuto un oggetto di tipo InputStreamReader collegato al file, come per la lettura da tastiera, possiamo creare un oggetto di tipo BufferedReader che può leggere una riga dal file. Per leggere da tastiera scriviamo BufferedReader inp= new BufferedReader (new InputStreamReader(System.in)); invece per leggere un file scriviamo BufferedReader inFile= new BufferedReader (new FileReader(mioFile)); ove mioFile è un oggetto di tipo File creato passando al costruttore una stringa contenente il nome del file: se il file non si trova nella stessa cartella della classe che lo legge, il nome deve essere completo del percorso per raggiungerlo, altrimenti ci sarà una situazione di errore. Per leggere tutte le righe di un file è necessario farlo in un ciclo: non è però possibile conoscere a priori il numero delle righe di un file, ma sappiamo che dopo la lettura dell’ultima riga continuando a leggere otterremo una riga con valore null, pertanto è sufficiente testare ogni volta che la riga letta sia != null. Vediamo ora il codice che dobbiamo scrivere per leggere un file di testo che si trova nella cartella C:\files\primo.txt String s, nome=”C:\files\primo.txt”; File mioFile=new File(nome); BufferedReader leggiFile; Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 1 Linguaggi Java if (!mioFile.exists()) { System.out.println("il file non c'è: verifica la cartella ed il nome del file"); } else { leggiFile = new BufferedReader(new FileReader(mioFile)); while(true) { s=leggiFile.readLine(); if(s==null) break; System.out.println(s); } } Per scrivere su un file ci si comporta in modo analogo alla scrittura: si utilizza sempre la classe File, alla quale si deve collegare un BufferedWriter che deve essere costruito con un FileWriter collegato al file. Per scrivere poi useremo il metodo write(stringa) tenendo presente che ci dobbiamo gestire il carattere per andare a capo \n, che dovremo aggiungere in testa alla stringa per scrivere in una nuova riga (lacosanon è necessaria perla prima riga). Bisogna fare attenzione che se si chiede di scrivere su un file che già esiste, si va a sovrascriverlo, perdendo così i dati precedentemente inseriti. Nel caso in cui si vogliano aggiungere delle righe in coda al file, si deve utilizzare un altro costruttore per la classe FileWriter, passandogli anche un secondo parametro che ha il significato append=true, il cui significato è che si vuole aggiungere in coda: FileWriter(mioFile,true) Vediamo ora il codice necessario per scrivere il file di testo C:\files\primo.txt String crea=""; if (mioFile.exists()) { System.out.println("il file esiste già: vuoi sovrascriverlo?si/no/A"); System.out.println("digitando A si aggiungeranno record al file"); crea=tast.readLine(); } if (crea.equals("SI") || crea.equals("si")) { FileWriter fw = new FileWriter(mioFile); BufferedWriter bw = new BufferedWriter(fw); bw.write("Questo è il nostro primo file"); bw.write("\nrec1"); bw.write("\nrec2"); bw.close(); Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 2 Linguaggi Java } else { if (crea.equals("A") || crea.equals("a")) { BufferedWriter fw = new BufferedWriter( new FileWriter(mioFile,true)); fw.write("\nho aggiunto in coda 1"); fw.write("\nho aggiunto in coda 2"); fw.write("ho aggiunto in coda 3"); fw.close(); } else { System.out.println("richiesta scrittura abbandonata"); } } } Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 3