Massimo Caliman
Massimo Caliman
1 min read

Categories

  • Java

Tags

  • Java
  • JDK7

Languages

  • Italian

Leggere e scrivere file in Java 7 sfruttando il nuovo costrutto try-with-resource manleva lo sviluppatore dal compito di chiudere correttamente gli stream, sotto potete trovare due metodi di esempio.

Per scrivere un file

protected boolean write(String name, String text) {
        boolean completed;
        try (Writer writer = 
new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(name), "utf-8"))) 
{
            writer.write(text);
            completed = true;
        } catch (IOException e) {
            completed = false;
            logger.log(Level.SEVERE, "", e);
        }
        return completed;
    }

e per leggerne il contenuto

public String read(String name) {
        String text = null;
        try (BufferedReader buffer = new BufferedReader(new FileReader(name))) {
            StringBuilder string = new StringBuilder();
            String line = buffer.readLine();
            while (line != null) {
                string.append(line).append(System.lineSeparator());
                line = buffer.readLine();
            }
            text = string.toString();
        } catch (FileNotFoundException e) {
            logger.log(Level.SEVERE, "", e);
        } catch (IOException e) {
             logger.log(Level.SEVERE, "", e);
        }
        return text;
    }

Quando il blocco try termina lo Stream verrà chiuso automaticamente. Questo è possibile perché le classi utilizzate nel blocco try-with-resources implementano l’interfaccia Java java.lang.AutoCloseable .

Tutte le classi che implementano questa interfaccia possono essere utilizzati all’interno del try-with-resources.

L’interfaccia AutoClosable ha un solo metodo close()

public interface AutoClosable {

   public void close() throws Exception;
}

Implementare AutoClosable su un nostro oggetto non richiede molto sforzo come si può vedere da codice di esempio che riporto qui sotto.

public class AutoClosableExampleObject implements AutoCloseable {

   @Override
   public void close() throws Exception {
      //do stuff and close
   }
}

Se non vogliamo catturare l’eccezzione basta omettere la parte catch del blocco ed essa si propagherà come se fosse non gestita (proprio così un try senza catch e senza finally). Ad essere sinceri il codice sopra avrebbe potuto beneficiare di altre novità della versione 7 come ad esempio i catch con gestione multipla di eccezioni ma di questo ed altro si parlerà in un prossimo post.