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.