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设计的这种不一致是否有任何原因?
答案 0 :(得分:3)
没有任何不一致......您应该比较BufferedReader
和BufferedWriter
。存在它们分别包装其他Reader
和Writer
。
基本原因是不同类型的Reader
和Writer
可能有不同的初始化方式和不同的运作方式,不一定包裹InputStream
或{ {1}}。在OutputStream
包裹BufferedReader
的示例中,InputStreamReader
可以(并且通常应该)使用InputStreamReader
和InputStream
进行初始化。 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一样。