字符I / O流与Java中的字节I / O流

时间:2014-12-24 06:29:11

标签: java io bufferedreader

继承自abstract class Readerabstract class Writer的字符流具体子类是否具有自己的I / O实现,而不依赖于abstract class InputStreamabstract class OutputStream的具体子类,是基于字节的I / O?

我理解字符流类将字符编码格式作为附加责任,但是,

abstract class Readerabstract class Writer下的字节流类层次结构外,为什么我们在abstract class InputStreamabstract class OutputStream下都有单独的层次结构?

2 个答案:

答案 0 :(得分:1)

当时这是一个巨大的语言设计决策,在java中有Unicode文本,能够组合所有脚本:

  • 二进制数据:byte[]InputStream/OutputStream
  • 文字:String/char(16位UTF-16),Reader/Writer

从二进制数据到文本和反向的步骤总是涉及需要编码字节的转换

由于Java还使用包装子类,如BufferedReader,StringReader,基类读取器/写入器,其中合理。 Java选择了这个,并且:

通过这种方式,您可以使用带有Reader参数的文本处理方法。

与C相比,java因此具有单独的byte类型和2字节char类型,持有UTF-16。在java中,几乎不应该尝试在String中保存二进制数据,或者将字节转换为char。

答案 1 :(得分:0)

  

Character是否具有继承自抽象类的具体子类类Reader和抽象类Writer有自己的I / O实现,而不依赖于抽象类InputStream和抽象类OutputStream的具体子类,它们是基于字节的I / O?< / p>

没有

  

我理解字符流类将字符编码格式作为附加责任

好。

  

但是,除了抽象类InputStream和抽象类OutputStream下的字节流类层次结构之外,为什么我们在抽象类Reader和抽象类Writer下给出了单独的层次结构?

出于刚刚描述的目的。它们本质上是一系列过滤器,它们根据字符而不是字节重新定义I / O API。