为什么InputStream obj不能直接嵌套到BufferedReader obj中?

时间:2010-10-07 01:44:20

标签: java api io

OutputStream obj可以直接连接到PrintWriter obj,例如,

//either is OK
new PrintWriter(socket.getOutputStream());
new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
但是对于InputStream obj,它必须通过InputStreamReader obj连接到BufferedReader obj,即
new BufferedReader(new InputStreamReader(socket.getInputStream())); //OK
new BufferedReader(socket.getInputStream()); //doesnt work
API设计的这种不一致是否有任何原因?

3 个答案:

答案 0 :(得分:3)

没有任何不一致......您应该比较BufferedReaderBufferedWriter。存在它们分别包装其他ReaderWriter

基本原因是不同类型的ReaderWriter可能有不同的初始化方式和不同的运作方式,不一定包裹InputStream或{ {1}}。在OutputStream包裹BufferedReader的示例中,InputStreamReader可以(并且通常应该)使用InputStreamReaderInputStream进行初始化。 Charset是否应该超载,当它唯一的工作是提供缓冲?

答案 1 :(得分:1)

当输入和输出流类已经被使用时,Java引入了Reader和Writer层次结构(我认为是java 1.1)。因此,使用桥接模式,它们允许您将流类传递到读取器类。 另外对于writer而言,PritnerWriter直接是桥类,它等同于InputStreamReader。你会看到BufferedWriter也是一样的东西 有关详细信息,请阅读http://www.codeguru.com/java/tij/tij0114.shtml

答案 2 :(得分:0)

BufferedReader可能正在装饰传入的InputReader。对于BufferedReader来说,接受一个它无法装饰的类是没有意义的,就像InputStream一样。