Java : InputStreamとReader

そもそもJavaでは、Streamはバイト列に対しての操作で、Reader/Writerは文字列に対しての操作という風に区別されているのじゃない?(そいういう風に理解して使っているけど)
InputStreamReaderは、InputStreamをReaderに変換するための変換器の役割であって、バイト列を文字列にマップするために文字コードの指定が必要ってことでしょ?
BufferedXXXはバッファリングの機能をストリームの機能と独立して提供するための仕組みだし、PrintXXXは整形出力の機能をストリームの機能と独立して提供するための仕組みで、非常に整然とされていてわかりやすいと思うのだけれど・・・

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(filename), charset));

と書くのが嫌なら、

BufferedReader in = new FileInputStream(filename).reader(charset).buffered();

というような今風のfluentなAPIならもっと印象がよかった?
でも、これを汎用的な仕組みとして提供するには、多重継承とかジェネリックプログラミングとかができないと難しいんじゃないかな。つまり、ユーザー定義ストリームクラスにreader()やbuffered()をどう実装するかということ。