文字列をファイルに出力することだけに関心がある場合は、PrintStreamおそらく他のクラスPrintWriterの代わりにor を使用してください。Writerとの注目すべき機能はPrintStream、PrintWriterそれらの印刷操作が をスローしないことIOExceptionです。またtoString、オブジェクトを自動的に呼び出すため、非常に便利です。
public void write1(Iterable<?> objects) {
try (PrintStream ps = new PrintStream("printout.txt", "UTF-8")) {
objects.forEach(ps::println);
} catch (IOException ioe) {
// handle
}
}
エラーが気になる場合は、 を呼び出すことができますがPrintStream.checkError、発生した可能性のあるエラーの詳細はわかりません。
forEachただし、許可されていないコンテキスト ( など) 内から例外をスローするメソッドを呼び出したい場合はどうすればよいかという一般的な問題は依然として残っています。これは、対処するのが煩わしいだけですが、それほどではありません。ただし、いくつかの設定が必要です。Consumerをスローするa を書きたいとしIOExceptionます。独自の機能インターフェースを宣言する必要があります。
interface IOConsumer<T> {
void accept(T t) throws IOException;
}
IOConsumer次に、 を に変換する関数を書く必要がありますConsumer。これは、IOExceptionキャッチしたUncheckedIOExceptionものを、この目的のために作成された例外である に変換することによって行われます。
static <T> Consumer<T> wrap(IOConsumer<? super T> ioc) {
return t -> {
try {
ioc.accept(t);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
};
}
これらが整ったら、元の例を次のように書き直すことができます。
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
}
}