java.io.PrintWriter のコンストラクタがやばい
エンコーディングを指定して Writer、Reader を生成する場合、
Writer writer = null; try { writer = new OutputStreamWriter(new FileOutputStream(file), encoding); doSomething(writer); } finally { IOUtils.closeQuietly(writer); }
ではまずくて、
OutputStream out = null; Writer writer = null; try { out = new FileOutputStream(file); writer = new OutputStreamWriter(out, encoding); } finally { IOUtils.clsoeQuietly(out); IOUtils.closeQuietly(writer); }
な感じにしないと UnsupportedEncodingException が投げられると FileOutputStream の close が行われないなくてまずいってことはどれくらいの Java プログラマが把握しているかどうかは怪しいにしても、既出のネタ。まぁ、J2SE 5.0 から PrintWriter に File と encoding を指定するコンストラクタが追加されたからそっち使っとけばいいと思ってたわけです。
で、この間 Java のソースコード*1を眺めてると、java.io.PrintWriter のコンストラクタが下記のようになってるじゃないか。
public PrintWriter(String fileName, String csn) throws FileNotFoundException, UnsupportedEncodingException { this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), csn)), false); }
そうか、Sun の Java プログラマーもこの問題を把握していないのか。つうか、普通にバグだよなぁ。Bug Database*2を検索しても見つからないから、後で報告しよう。
でも、だれか変わりに報告しておいてくれたりすると嬉しいなぁ。だれか代わりに報告してくれる親切な人はいないっすか?