In questo articolo vedremo come scrivere testo all’interno di un file utilizzando Java, cioè come gestire, a livello applicativo, i file memorizzandovi all’interno alcuni semplici contenuti testuali.
Premessa: utilizzare semplici file di testo come "database"
Scrivere dati su un file può risultare utile in molti contesti applicativi. Pensiamo ad esempio ad un programma che debba registrare delle attività all’interno di un file di LOG, oppure ad un software che debba gestire elaborazioni relative all’anagrafica dei clienti di una ditta. Certamente è importante che, dopo ogni esecuzione, le modifiche vengano salvate all’interno di un database oppure, quando ciò non è possibile o opportuno, all’interno di un semplice file testuale.
Un semplice file di testo, infatti, può rappresentare uno strumento utile per l’archiviazione di dati, una sorta di contenitore in cui è possibile reperire ed immagazzinare le informazioni elaborate dai nostri programmi, più o meno come facciamo con un comune database.
Scrivere un file con Java
Ma come è possibile scrivere su file? Prendiamo in esame il caso di programmi scritti in linguaggio Java, uno tra i linguaggi di programmazione più diffusi al mondo. Proprio a sottolineare l’importanza di questo tipo di operazioni, Java mette a disposizione alcune classi di libreria (ovvero "pre-programmate", a disposizione quindi di ogni programmatore) dedicate in modo specifico alla scrittura su file (e, in modo complementare, alla lettura da file).
Si intende per classe un insieme di dati (che chiamiamo dati membro) e di funzioni utili all’elaborazione e alla gestione dei dati stessi (che vengono chiamate invece metodi della classe).
La classe ProvaScritturaSuFile
Nell’esempio di programma che stiamo per realizzare programmeremo autonomamente una classe di nome ProvaScritturaSuFile, che sfrutterà al suo interno le classi di libreria FileOutputStream e PrintStream.
La classe FileOutputStream ci servirà per creare un canale di comunicazione tra il nostro programma e il file su cui desideriamo scrivere. Ci serviremo invece della classe PrintStream per effettuare le operazioni di scrittura sul file stesso. Entrambe le classi fanno parte della libreria java.io, quindi è necessario segnalare che ci stiamo servendo di tale libreria. Otteniamo tale risultato in questo modo, servendoci della keyword (o parola-chiave) import:
import java.io.*;
Prendiamo a questo punto in esame un semplice esempio di programma Java che realizzi l’operazione di scrittura su file.
import java.io.*;
class ProvaScritturaSuFile {
public static void main (String args[]) {
try
{
FileOutputStream prova = new FileOutputStream("prova.txt");
PrintStream scrivi = new PrintStream(prova);
for(int i=0;i<10;i++)
{
scrivi.println("Test");
}
}
catch (IOException e)
{
System.out.println("Errore: " + e);
System.exit(1);
}
}}
Come possiamo vedere, definiamo un metodo main, che viene richiamato automaticamente all’atto dell’esecuzione del programma. Tale metodo, per prima cosa, crea tramite la keyword (parola-chiave) new un nuovo oggetto di tipo FileOutputStream di nome prova, ovvero una realizzazione concreta del modello astratto rappresentato proprio dalla classe FileOutputStream. Un insieme di dati e di metodi cioè non generico ma specifico, che fa riferimento ad un particolare file. Viene fornito infatti un parametro ("prova.txt"), che identifica proprio il nome del file su cui si desidera scrivere.
Se non specificato diversamente, il file viene cercato nella directory in cui è presente il file .java che rappresenta il programma. Se il file prova.txt non esiste, viene creato un file vuoto di nome prova.txt.
A questo punto generiamo un oggetto di tipo PrintStream di nome scrivi, a cui viene passato come parametro l’oggetto prova appena creato. Dopo aver individuato il file su cui scrivere con la creazione dell’oggetto prova, effettuiamo così il collegamento logico tra il file e l’operazione di scrittura, generando l’oggetto scrivi.
Non resta che testare la possibilità di interagire con il file, ad esempio con un semplice ciclo for che porti a scrivere 10 volte "Test" sul file prova.txt, andando a capo ciascuna volta (il che viene ottenuto tramite il metodo println della classe PrintStream, con l’istruzione scrivi.println("Test")).
Un’ultima precisazione riguarda l’uso di try e catch. Le istruzioni contenute nel programma possono generare un particolare tipo di problema detto IOException, o "eccezione di input/output". Tale problema viene riscontrato nel caso si verifichi l’interruzione o il fallimento di un’operazione di input o, come in questo caso, di output (la scrittura su file).
L’inserimento di tali istruzioni in un blocco contraddistinto dalla keyword try consente di definire successivamente un blocco identificato dalla parola catch per gestire l’errore. In questo caso, per semplicità, in caso si rilevi questo tipo di problema decidiamo di stamparne la causa (System.out.println("Errore: " + e)) e di uscire dal programma (System.exit(1)).
Verifichiamo il corretto funzionamento del programma visualizzando, dopo l’esecuzione dello stesso, il contenuto del file prova.txt.