Corso di Java

(senza pretese)

Lezione undici: aprire e salvare files.


Premessa
A dire la verità all'inizio avevo intenzione di continuare sulle orme della lezione precedente e ampliare l'applicazione vista in precedenza, aggiungendo altri elementi di interesse generale, come i menu... già i menu! Come tutti i menu che si rispettano, il menu "File" contiene le voci 'Apri' e 'Salva' e allora, prima di aggiungere un bel menu alla nostra applicazione, vediamo come aprire e salvare dei semplici files di testo.

Aprire files
A dire tutta la verità per un utilizzo standard, di solito il codice necessario per aprire (e per salvare, più sotto) files viene letteralmente copiato da un'applicazione precedente che ne fa uso e adesso vedendo il codice capirete di sicuro perché.

public void leggi()
 {

  //Il seguente oggetto e' il box che permette di scegliere
  //un file (non si distingue tra aprire e salvare, ma si
  //permette di scegliere il file su cui agire)

  JFileChooser apri_box = new JFileChooser();

  //Qui viene specificato che deve essere un box con il file
  //da aprire (nella barra del titolo viene scritto 'Open'

  apri_box.showOpenDialog(this);

  //Questa stringa conterra' il percorso del file

  String file_da_aprire = apri_box.getSelectedFile().getPath();

/* I blocchi try...catch servono per evitare i problemi dovuti
   a files inesistenti o danneggiati
*/

  try
  {

   //Come dice il nome, legge il file che viene specificato

   FileReader lettore = new FileReader(file_da_aprire);

   //Intero per avere il conto di dove siamo dentro al file e
   //stringa per 'tradurre' il file aperto in qualcosa di
   //assegnabile ad un campo di testo.

   int inByte = 0;
   String appoggio = "";

   //Fino a che inByte e' diverso da -1 (che indica la fine
   //del file) si legge il byte, si assegna alla stringa
   //di appoggio che abbiamo creato. Se c'e' un errore
   //viene mandato fuori un messageDialog con i dettagli
   //dell'errore.

   do
    {
     try{
     inByte = lettore.read();
        }
     catch(IOException e)
     { JOptionPane.showMessageDialog(null, e);
     }

     if (inByte != -1)
     appoggio+=(char)inByte;
    }
    while (inByte != -1);


    //Assegno la stringa di appoggio ad una area di testo
    //precedentemente creata

    area_testo.setText(appoggio);

    //Occhio! I FileReader devono essere chiusi!!!

    try {
    lettore.close();
       }
     catch(IOException e)
     { JOptionPane.showMessageDialog(null, e);
     }
   }

  catch (FileNotFoundException e)
  {
   JOptionPane.showMessageDialog(null, e);
   }
   //Fine blocco principale TRY-CATCH

   }


Per essere onesti al 100%, togliete i commenti, cambiate l'oggetto a cui indirizzare il testo letto e questa è una funzione che potete usare in tutte le applicazioni che permettono di leggere files.
Come avete visto si tratta di selezionare un file, aprire un FileReader, estrarre byte per byte tutto quello che c'è dentro il file scelto, copiarlo (o meglio indirizzarlo) da qualche parte e mostrarlo a tutto il mondo!

Salvare un file
In poche parole si usa lo stesso meccanismo dell'apertura di un file, salvo sostituire la parte che 'preleva' il contenuto di un file e lo mette in una stringa con una analoga, ma che va nel verso opposto, ovvero da una stringa ad un file. Vediamo come implementarlo:

public void funzione_salva()
  {

/*Come nella funzione per aprire un file si usa un
  filechooser con un SaveDialog (appare la scritta 'Save'
  nella barra del titolo) e si sceglie un file dove
  salvare, indicandone il percorso (path).
*/
 
  JFileChooser apri_box = new JFileChooser();
  apri_box.showSaveDialog(this);
  String file_in_cui_salvare = apri_box.getSelectedFile().getPath();

/*Stringa che fa da buffer per il testo da salvare*/

  String da_salvare = area_testo.getText();


/*Si scrive il file, come al solito dentro un blocco try...catch*/

  try {

//Questo ci permette di scrivere un file.

  FileWriter salvataggio = new FileWriter(file_in_cui_salvare);

/*Scrivo il file indicando da dove prendere il testo 
(la stringa chiamata 'da_salvare', dal primo carattere (zero)
 fino alla fine. Dato che la lunghezza può essere
variabile si usa il metodo getText().lenght() che ci dice
quanto è lunga la stringa.
*/
 
  salvataggio.write(da_salvare, 0, area_testo.getText().length());

//Chiudiamo lo stream di caratteri

  salvataggio.close();
      }

/*In caso di errore viene visualizzato un MessageDialog che  
 spiega l'errore*/
 
  
 catch(IOException e)
  {
   JOptionPane.showMessageDialog(null, e);}
  }



Come avete visto, la cosa è molto semplice (e questo è un codice, diciamo, 'universale', nel senso che in una normale applicazione basterà fare un copia-incolla delle due funzioni e adattare come unica cosa la JTextArea 'area_testo' che ho usato nelle due funzioni, cambiandone il nome con quello della vostra area da cui viene preso il testo da salvare.

Nella prossima lezione aggiungeremo queste due funzioni alla applicazione vista nella scorsa lezione, aggiungendovi quindi anche un menu da cui scegliere le voci 'Apri' e 'Salva' (e anche qualcos'altro... piccola sorpresa!) e un paio di bottoni che facciano la stessa cosa, quindi... stay tuned! e alla prossima lezione!!!

Prossima pagina

Indice Webdesign