ふと気がついたのですが、File.open にブロックを与えると有無をいわさず
IO#close を呼ぶようです。たとえば、

% ruby -e '
class C < File
  def close
    p :called
    super
  end
end
C.open("/dev/null") {|f| p f; p f.method(:close) }
'
#<C:/dev/null>
#<Method: C#close>

というように、サブクラス C で再定義されていても、IO のメソッドが直接呼
ばれます。つまり、上の例でいえば :called と出力されることを期待したの
にそうなりません。
(File#close を定義して、Kernel#open を呼んだときなども同様です。)

これって意図的でしょうか?

ちょっと自前でバッファリングしてみようかな、と思ったのですが...
-- 
[田中 哲][たなか あきら][Tanaka Akira]