文字列をファイルに出力することだけに関心がある場合は、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
}
}