[英]what is the use of character stream in java?
java中字符流的作用是什么? 为什么我们在有字节流时需要?我浏览了很多网站我都没有清楚...请让我清楚...请不要粘贴谷歌搜索结果
我假设您是说Reader
界面? 如果您正在处理文本,则不必担心每一层的二进制/文本转换。 实际上,从概念上讲,您甚至可能没有要转换的二进制数据——例如,看看StringReader
。
拥有Reader
界面可以清楚地表明您确实想要文本,并且该文本下的二进制数据与您无关,只要它可以以某种方式作为 Unicode 字符序列提供。
值得在您心中非常清楚二进制和文本是不同的。 如果您尝试将任意二进制数据视为文本(例如,尝试将图像文件读入字符串),您将丢失信息。 为什么不希望不同类型来处理不同形式的数据?
这有点像说,“我们可以将每个对象的数据存储在一个字节数组中,并在需要时转换其中的部分。” 是的,我们可以(如果您可以将不透明的二进制数据转换为引用或从引用转换),但在封装方面会很糟糕。 Reader
接口是一层封装,允许各种数据源公开字符数据(无论是否需要解码二进制数据)和其他代码来使用该字符数据,而不必知道它的确切来源。
对不起,但谷歌结果实际上回答了你的问题。 从Sun 的网站(第一次谷歌搜索character stream java
):
为什么要使用字符流? 字符流的主要优点是它们可以轻松编写不依赖于特定字符编码的程序,因此易于国际化。
字符流的第二个优点是它们可能比字节流更高效。 许多 Java 原始字节流的实现都是围绕着一次一个字节的读写操作进行的。 相比之下,字符流类面向一次缓冲区的读写操作。 这种差异与更有效的锁定方案相结合,允许字符流类在许多情况下弥补编码转换的额外开销。
字符流是处理文本文件等字符数据的便捷方式。 您可以采用字节流并为其提供字符编码并将其有效地转换为字符流,类似地,您可以采用字符流并提供字符编码并将其有效地转换为字节流。
转换通常通过装饰流来完成。 正如您可能猜到的,字符编码是一种将字符转换为字节的算法,反之亦然。
冒着听起来讽刺的风险,它的目的是读取字符流。
关键是字符与字节不同。
一个字节是 8 位的集合,唯一可能的变化是它的大端或小端。
角色是更复杂的小野兽。 它属于一个字符集,并受国家语言设置的影响。
最简单的是将 NLS 设置为“C”的 ASCII,它与字节几乎相同,除了值具有特定的意思=ings 例如 x'30' 是 ASCII 字符 '0',如果'isNumber() 将返回真' 方法被应用。 接下来是各种 ISO 八位代码页,这些代码页通常会在 x'7F' 上方随机排列字符分配,以处理欧洲重音字符。
此外,还有其他编码,例如 EBCDIC,它们仍然被广泛使用——这里的“0”被编码为 x“F0”。
然后是 unicode-16 它将编码来自各种广泛使用的字母表中的数千个字符和 unicode-32 它将编码来自广泛使用和不那么广泛使用的(例如 Klingon 和 Mycinean)字母表中的数百万个字符。
有中间的 utf-8 编码,它留下了 7 位编码的普通旧 ASCII 字符,但也有非常聪明的算法,用于将整个 unicode 字母表存储在两个、三个或四个字节中。
此外,还有用于日文和中文字符的“传统”远东编码方案,它们具有复杂的方案,用于指示字符是否包含在一个、两个或三个字节中。
关键是该字符流类知道所有这些代码页,并且可以对字符输入执行智能操作,例如将 cp874 转换为 unicode-16,而字节流类则不能。
是的,可以使用 InputStream/OutputStream 处理文本数据,但 Reader/Writer 接口提供了处理文本数据的有用方法。
我认为这只是遵循等级制度的问题。 与字符串的原因相同,即使您可以简单地使用字符数组而不是字符串。
本质上,问题在于“一个字节”不能很好地映射到“一个字符”。 Unicode 指定的字符多于 16 位,因此 8 位是不够的。
还有更多原因,但这是首要原因。
Java 平台使用 Unicode 约定存储字符值。 字符 I/O 流自动将此内部格式转换为本地字符集或从本地字符集转换。 在西方语言环境中,本地字符集通常是 ASCII 的 8 位超集。
对于大多数应用程序,字符流的 I/O 并不比二进制流的 I/O 复杂。 使用流类完成的输入和输出会自动与本地字符集相互转换。
使用字符流代替字节流的程序会自动适应本地字符集,并为国际化做好准备——这一切都不需要程序员额外的努力。
所有字符流类都继承自 Reader 和 Writer。 与字节流一样,有专门用于文件 I/O 的字符流类:FileReader 和 FileWriter。
此层次结构下的类用于从文件(文本文件)中读取和写入字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.