Se tutto ciò che si preoccupa è la stampa di stringhe su un file, utilizzare uno PrintStream
o forse PrintWriter
anziché le altre classi Writer
. La caratteristica notevole di PrintStream
e PrintWriter
è che le loro operazioni di stampa non generano IOException
. Chiedono inoltre toString
su oggetti automaticamente, il che rende le cose molto convenienti:
public void write1(Iterable<?> objects) {
try (PrintStream ps = new PrintStream("printout.txt", "UTF-8")) {
objects.forEach(ps::println);
} catch (IOException ioe) {
// handle
}
}
Se siete preoccupati per gli errori, è possibile chiamare PrintStream.checkError
, anche se questo non vi dice eventuali specifiche su qualsiasi errore che potrebbe essersi verificato .
La domanda generale rimane, tuttavia, su cosa fare se si desidera chiamare un metodo di lancio di eccezioni da un contesto (come forEach
) che non lo consente. Questo è solo fastidioso da affrontare, anche se solo moderatamente. Tuttavia richiede alcune impostazioni. Supponiamo di voler scrivere uno Consumer
che lanci uno IOException
.Dobbiamo dichiarare la nostra propria interfaccia funzionale:
interface IOConsumer<T> {
void accept(T t) throws IOException;
}
Ora abbiamo bisogno di scrivere una funzione che converte un IOConsumer
ad un Consumer
. Lo fa convertendo qualsiasi IOException
in uno UncheckedIOException
, un'eccezione creata per questo scopo.
static <T> Consumer<T> wrap(IOConsumer<? super T> ioc) {
return t -> {
try {
ioc.accept(t);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
};
}
Con questi a posto, possiamo ora riscrivere l'esempio originale come segue:
public void write2(Iterable<?> objects) {
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"), "UTF-8"))) {
objects.forEach(wrap(o -> bw.write(o.toString())));
} catch (IOException|UncheckedIOException e) {
//handle exception
}
}
fonte
2015-04-25 06:46:57
Puoi compilarlo tramite la riga di comando? Quale versione di Eclipse? – javajavajava