Gestione dei File
In Java, la gestione dei file può essere effettuata utilizzando la classe java.io.File. Questa classe fornisce una serie di metodi per creare, eliminare, modificare e gestire i file e le directory. Ad esempio, si può utilizzare il metodo File.createNewFile() per creare un nuovo file, il metodo File.delete() per eliminare un file esistente, e il metodo File.renameTo() per rinominare un file.
Inoltre, si può utilizzare la classe java.io.FileInputStream e java.io.FileOutputStream per leggere e scrivere i dati su un file.
Per elaborare i contenuti di un file si possono utilizzare classi come java.io.BufferedReader, java.io.BufferedWriter e java.io.FileReader, FileWriter. E’ importante notare che l’utilizzo di queste classi e metodi richiede la gestione delle eccezioni IOException.
Gestione delle Classi java.io.File
Ovviamente prima di utilizzare la classe diciamo che File e quella che rappresenta un File oppure una directory (cartella) del File System, ovvero il sistema di archiviazione e organizzazione dei file su disco rigido del computer. La classe File può essere istanziata in due modi a seconda a seconda dei parametri utilizzati:
File file = new File(“/path/to/file“);
In questo caso si utilizza il percorso del File System altrimenti:File file = new File(“/path/to/directory“, “fileName“);
In entrambi i casi, il percorso del file system può essere assoluto o relativo. Il percorso assoluto fornisce un percorso completo a partire dalla radice del file system, mentre il percorso relativo è basato sul percorso corrente dell’applicazione.
Alcuni metodi più comuni della classe File sono:
createNewFile(): crea un nuovo file.delete(): elimina un file o una directory.exists(): verifica se un file esiste.isDirectory(): verifica se un file è una directory.isFile(): verifica se un file è un file regolare.listFiles(): restituisce un array di file in una directory.length(): restituisce la dimensione di un file
Diamo uno sguardo ad alcuni algoritmi che potrebbero meglio illustrarci l’ utilizzo della classe File e relativi metodi:
Il metodo di Fig-1 è stato implementato solo per la creazione di un nuovo file (riga-11) nella cartella del progetto, percorso relativo, dove il metodo createNewFile() ritorna un booleano true oppure false, possiamo notare anche l’ utilizzo del metodo getName() (riga-12) per ottenerne il nome.
Come è stato accennato in precedenza per la gestione dei file dobbiamo tenere conto delle eccezioni che verranno gestite attraverso il costrutto try/catch. Se invece vogliamo controllare l’ esistenza di un file, magari in un determonato percorso, possiamo utilizzare il metodo exists() sempre della classe File:
Classi FileReader e FileWriter
La fine del file viene controllata dal metodo read(), infatti questo metodo ritorna il carattere letto come numero, la presenza del cast alla riga-15 di Fig-3 è per stampare il carattere, ma ritorna -1 se incontra la fine del file (eof – end of file).
Ecco un esempio di come utilizzare la classe java.io.FileWriter per implementare un algoritmo per scrivere in un file:
Nell’ esempio di Fig-4 il file archivio.txt è nella cartella del progetto quindi con questo algoritmo verrà sempre sovrascritto (riga-13), per inserire in esso stringhe attraverso l’ utilizzo del metodo write() (righe 14-16). Per evitare problemi di memoria o che il file si possa corrompere è necessario chiuderlo come si può notare dalla riga-17.
Nell’ esempio precedente la classe FileWriter accetta come parametro solo l’ oggetto file sovrascrivendo per default il contenuto. Ma se volessimo aggiungere righe di testo a quelle già esistenti dobbiamo dichiarare che il file verrà gestito in append attraverso la seguente istanza (Fig-4 riga 13)
FileWriter fileWriter = new FileWriter(file, true);
In questo caso il contenuto del file non verrà sovrascritto ma ogni stringa aggiunta con il metodo write() verrà accodata.
Classi BufferReader e BufferWriter
La classe BufferedReader estende la classe FileReader e fornisce un buffer di lettura interno. Prima di leggere i dati dal file system vengono accumulati nel buffer. Ciò riduce la quantità di operazioni di I/O effettuate sul file system e migliora le prestazioni dell’applicazione.
In sintesi, se si desidera leggere direttamente dal file system, si può utilizzare la classe FileReader. Tuttavia, se si desidera migliorare le prestazioni dell’applicazione, si consiglia di utilizzare la classe BufferedReader che fornisce un buffer di lettura interno. Il seguente esempio mostra l’ utilizzo di un oggetto della classe BufferedReader che attraverso metodi legge un file di testo, presente nella stessa cartella del progetto:
La classe BufferedWriter una classe di alto livello che offre una interfaccia testuale per la scrittura di file. Ecco un esempio di come utilizzarla:
La classe utilizza il metodo write() per scrivere nel file ma potrebbe utilizzare anche il metodo println().
Classe FileOutputStream
FileOutputStream è una classe di basso livello che offre una interfaccia binaria per la scrittura di file. Le prestazioni di questa classe rispetto a BufferedWriter sono più veloci proprio perche non bufferizza prima di scrivre su disco, tuttavia la seconda è più efficiente quando si devono scrivere grandi quantità di dati. BufferedWriter scrive i dati come stringhe, mentre FileOutputStream scrive i dati come byte. Questo significa che BufferedWriter è più adatto alla scrittura di dati testuali, mentre FileOutputStream è più adatto alla scrittura di dati binari.
La classe FileOutputStream è adatta per scrivere file binari, ovvero file che contengono dati binari spesso complessi, come immagini e video non leggibili dall’ uomo ma dalla macchina. Vogliamo anche ricordare che un valore di tipo byte rappresenta un numero intero a 8 bit, ovvero un numero compreso tra -128 e 127. Di seguito un esempio sull’ utilizzo di un array primitivo di tipo byte:
Nell’ esempio successivo utilizziamo la classe FileOutputStream per scrivere un array di byte su un file:
Classe FileInputStream
La classe FileInputStream in Java è una classe di base per la lettura dei dati da un file ed ecco alcuni dei possibili utilizzi:
-
Lettura di file binari: La classe
FileInputStreampuò essere utilizzata per leggere file binari, ad esempio file immagine, audio o video. - Lettura di file di testo: La classe
FileInputStreampuò essere utilizzata anche per leggere file di testo, anche se in questo caso esistono classi più convenienti comeFileReaderoBufferedReader. - Copiare file: La classe
FileInputStreampuò essere utilizzata per copiare un file da una posizione all’altra, leggendo i dati dal file sorgente e scrivendoli in un nuovo file. - Lettura di dati specifici: La classe
FileInputStreamsupporta la lettura di dati specifici da un file, ad esempio un singolo byte o una porzione di dati di dimensioni specifiche.
Vediamo un esempio in cui la classe FileInputStream è utilizzata per leggere un file binario:
LABORATORIO
In questa esercitazione utilizziamo oggetti della classe File, della classe FileInputStram e FileOutputStream per creare da una immagine alunno.jpg un array di byte e successivamente ricostruire l’immagine leggendo l’ array di byte.
Il progetto può essere importato in Eclipse prospettiva SE:
-
leggiimmagine.zip
(zip, 28KB)
-
Questa esercitazione legge riga per riga una file di testo, contenuto nella cartella del progetto. Per la realizzazione occorrono alcune classi tra cui quelle per la gestione dei file e quindi abbiamo la classe File, la classe FileReader e BufferReader. Il progetto può essere importato in Eclipse prospetiva SE:
-
leggifile.zip
(zip, 3KB)
-
Ciclare un array string[ ] e scrivere in un file di testo il contenuto di ogni posizione. Le classi utilizzate a tal proposito sono FileWriter e BufferWriter. Il progetto può essere importato in Eclipse prospettiva SE e contiene il file archivio.txt :
-
arraytofile.zip
(zip, 3KB)
-
Il metodo legge un file di testo, archivio.txt, composto da cinque righe per poi aggiungerle ad un array primitivo di tipo String[5]. Si utilizzano le classi FileReader e BufferReader. Il progetto che contiene anche il file di testo si può importare in Eclipse prospettiva SE:
-
filetoarray.zip
(zip, 3KB)
-
