java中字符流的用途是什么?

时间:2010-01-04 06:25:03

标签: java oop java-ee

java中字符流的用途是什么?为什么我们需要有字节流?我已经通过很多网站我明白了...请让我明白...请不要粘贴谷歌搜索结果

8 个答案:

答案 0 :(得分:7)

我认为你的意思是Reader界面?如果您正在使用文本,则不必担心每一层的二进制/文本转换。实际上,从概念上讲,您甚至可能无法转换二进制数据 - 例如,请查看StringReader

使用Reader接口清楚地表明您确实需要文本,并且该文本下面的二进制数据与您无关,只要它可以某种方式作为Unicode字符序列提供。

值得在非常明确表示二进制和文本是不同的。如果您尝试将任意二进制数据视为文本(例如,尝试将图像文件读入字符串),您将丢失信息。为什么想要不同的类型来处理不同形式的数据?

这有点像说,“我们可以将每个对象的数据存储在一个字节数组中,并在需要的时候转换它们的各个部分。”是的,我们可以(如果您可以将不透明的二进制数据转换为引用/从引用转换)但在封装方面它将是可怕的。 Reader接口是一个封装层,允许各种数据源公开字符数据(无论是否需要解码二进制数据),以及其他代码消耗该字符数据,而不必知道确切位置它来自。

答案 1 :(得分:5)

对不起,谷歌搜索结果实际上回答了你的问题。来自Sun's网站(第一次谷歌点击character stream java):

  

为什么要使用字符流?   字符流的主要优点是它们可以轻松编写不依赖于特定字符编码的程序,因此易于国际化。

     

字符流的第二个优点是它们可能比字节流更有效。许多Java原始字节流的实现都是围绕一次一个字节的读写操作。相反,字符流类是围绕一次缓冲读取和写入操作。这种差异与更有效的锁定方案相结合,允许字符流类在许多情况下弥补编码转换的额外开销。

答案 2 :(得分:5)

字符流是处理文本文件等字符数据的便捷方式。您可以采用字节流并为其提供字符编码,有效将其转换为字符流,类似地,您可以获取字符流并提供字符编码和有效将其转换为字节流。

转换通常通过装饰流来完成。正如您可能猜到的,字符编码是将字符转换为字节的算法,反之亦然。

答案 3 :(得分:4)

冒着讽刺的风险,其目的是阅读一串人物。

重点是字符与字节不同。

一个字节是8位的集合,唯一可能的变量是它的big-endian还是little-endian。

角色是一个更复杂的小野兽。它属于字符集,受国家语言设置的影响。

最简单的是ASCII,NLS设置为“C”,它与字节几乎完全相同,只是值具有特定的meano = ings,例如x'30'是ASCII字符'0',如果'是',它将返回true isNumber()'方法已应用。 接下来的比例是各种ISO八位代码页,它们正常地将x'7F'上方的字符分配混合以处理欧洲重音字符。

此外还有其他编码,如EBCDIC仍然广泛使用 - 这里'0'被编码为x'F0'。

然后有unicode-16,它将从各种广泛使用的字母和unicode-32中编码数千个字符,这些字符可以广泛地编码数百万个字符,而不是广泛使用(例如Klingon和Mycinean)字母。

有一个中间的utf-8编码,它留下普通的旧ASCII字符,编码为7位,但也有非常聪明的算法,用于存储两个,三个或四个字节的整个unicode字母。

此外,日语和中文字符还有“遗留”远东编码方案,这些方案具有复杂的方案,用于指示字符是以一个,两个还是三个字节保存。

重点是该字符流类知道所有这些代码页,并且可以使用字符输入执行智能操作,例如将cp874转换为unicode-16,字节流类不能。

答案 4 :(得分:0)

是的,可以使用InputStream / OutputStream处理文本数据,但Reader / Writer接口提供了处理文本数据的有用方法。

答案 5 :(得分:0)

我认为这只是遵循等级制度的问题。即使您可以简单地使用字符数组而不是字符串,也有相同的原因。

答案 6 :(得分:0)

基本上问题是“一个字节”不能很好地映射到“一个字符”。 Unicode指定的字符多于16位,因此8位是不够的。

还有更多原因,但这是主要原因。

答案 7 :(得分:0)

Java平台使用Unicode约定存储字符值。字符I / O流自动将此内部格式与本地字符集进行转换。在西方语言环境中,本地字符集通常是ASCII的8位超集。

对于大多数应用程序,使用字符流的I / O并不比使用二进制流的I / O复杂。使用流类完成的输入和输出会自动与本地字符集进行转换。

使用字符流代替字节流的程序会自动适应本地字符集,并可以进行国际化,而这一切都无需程序员付出额外的精力。

所有字符流类均来自Reader和Writer。与字节流一样,还有专门用于文件I / O的字符流类:FileReader和FileWriter。

此层次结构下的类用于从文件(即文本文件)读取和写入字符。