字节流和字符流

48
请解释字节流和字符流是什么。它们具体是什么意思?微软Word文档是面向字节还是面向字符的?
谢谢
5个回答

58

流是一种按顺序访问文件的方式。字节流逐字节访问文件。字节流适合于任何类型的文件,但对于文本文件不是很合适。例如,如果文件使用Unicode编码,并且一个字符由两个字节表示,则字节流将分别处理它们,您需要自己进行转换。

字符流将逐个字符地读取文件。字符流需要给出文件的编码才能正常工作。

尽管Microsoft Word文档包含文本,但无法使用字符流访问它(它不是文本文件)。您需要使用字节流来访问它。


谢谢kgiannakakis, 那.txt文件呢? - JavaUser
2
字符流适用于读取 .txt 文件。但是,正如我所说,您需要知道文本文件的编码方式。 - kgiannakakis
我在询问 Windows 操作系统中是否存在 .txt 文件。 - JavaUser
2
@JavaUser 不论你在哪个操作系统上拥有你的 .txt 文件,它可以是任何字符编码,并且通常不可能明确地检测到 .txt 文件使用的字符编码。最常见的编码是 ISO-8859-1UTF-8 - Jesper
如果您使用了新的XML格式之一,那么您的Word文档可能是文本格式 :-) - dty

14

字节流(ByteStreams):

根据Oracle关于字节流的文档页面:

程序使用字节流执行8位字节的输入和输出。所有字节流类都是从InputStreamOutputStream派生而来。

enter image description here

何时使用:

只应在进行最基本的 I/O 时使用字节流

不宜使用:

不应使用字节流读取字符流,例如读取文本文件

字符流(Character Streams):

根据Oracle关于字符流的文档页面:

Java平台使用Unicode约定存储字符值。字符流 I/O 自动将这种内部格式与本地字符集之间进行转换。

所有字符流类都是从ReaderWriter派生而来。

字符流通常是字节流的“包装器”。字符流使用字节流执行物理 I/O,而字符流处理字符和字节之间的转换。

有两个通用的字节到字符的“桥接”流:InputStreamReaderOutputStreamWriter

何时使用:

SocketFile中读取字符流

总结:

字节流是逐个字节读写的。在处理更复杂的数据时,应避免使用字节流。

应该使用字符流和其他可用的流来处理复杂的数据。


2
这些概念总是一个谜。问题 - overexchange

6

1.面向字符的流与数据类型绑定。只有字符串类型或字符类型可以通过它来读取,而面向字节的流不绑定任何数据类型,可以读取任何数据类型(除了字符串),只需指定即可。

2.面向字符的流逐个字符地读取,而面向字节的流逐字节地读取。

3.面向字符的流使用字符编码方案(UNICODE),而面向字节的流不使用任何编码方案。

4.面向字符的流也称为读写器流,面向字节的流称为数据流-数据输入流和数据输出流。


5

阅读这篇文章。它告诉你字节和字符之间的区别(以及许多其他有用的内容)。


0

字符流将逐个字符地读取文件。字符流能够读取16位字符(字节流只能读取8位字符)。字符流能够隐式地将8位数据转换为16位数据或反之亦然。字符流可以支持所有类型的字符集ASCII、Unicode、UTF-8、UTF-16等。但是字节流仅适用于ASCII字符集。Java平台使用Unicode约定存储字符值。字符流I/O会自动将此内部格式与本地字符集进行转换。

除非您正在处理二进制数据,例如图像和声音文件,否则应使用读取器和写入器来使用字符流读取和写入信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接