谢谢
流是一种按顺序访问文件的方式。字节流逐字节访问文件。字节流适合于任何类型的文件,但对于文本文件不是很合适。例如,如果文件使用Unicode编码,并且一个字符由两个字节表示,则字节流将分别处理它们,您需要自己进行转换。
字符流将逐个字符地读取文件。字符流需要给出文件的编码才能正常工作。
尽管Microsoft Word文档包含文本,但无法使用字符流访问它(它不是文本文件)。您需要使用字节流来访问它。
字节流(ByteStreams):
根据Oracle关于字节流的文档页面:
程序使用字节流执行8位字节的输入和输出。所有字节流类都是从
InputStream
和OutputStream
派生而来。
何时使用:
只应在进行最基本的 I/O 时使用字节流
不宜使用:
不应使用字节流读取字符流,例如读取文本文件
字符流(Character Streams):
根据Oracle关于字符流的文档页面:
Java平台使用Unicode约定存储字符值。字符流 I/O 自动将这种内部格式与本地字符集之间进行转换。
所有字符流类都是从Reader
和Writer
派生而来。
字符流通常是字节流的“包装器”。字符流使用字节流执行物理 I/O,而字符流处理字符和字节之间的转换。
有两个通用的字节到字符的“桥接”流:InputStreamReader
和OutputStreamWriter
。
何时使用:
从Socket
或File
中读取字符流
总结:
字节流是逐个字节读写的。在处理更复杂的数据时,应避免使用字节流。
应该使用字符流和其他可用的流来处理复杂的数据。
1.面向字符的流与数据类型绑定。只有字符串类型或字符类型可以通过它来读取,而面向字节的流不绑定任何数据类型,可以读取任何数据类型(除了字符串),只需指定即可。
2.面向字符的流逐个字符地读取,而面向字节的流逐字节地读取。
3.面向字符的流使用字符编码方案(UNICODE),而面向字节的流不使用任何编码方案。
4.面向字符的流也称为读写器流,面向字节的流称为数据流-数据输入流和数据输出流。
字符流将逐个字符地读取文件。字符流能够读取16位字符(字节流只能读取8位字符)。字符流能够隐式地将8位数据转换为16位数据或反之亦然。字符流可以支持所有类型的字符集ASCII、Unicode、UTF-8、UTF-16等。但是字节流仅适用于ASCII字符集。Java平台使用Unicode约定存储字符值。字符流I/O会自动将此内部格式与本地字符集进行转换。
除非您正在处理二进制数据,例如图像和声音文件,否则应使用读取器和写入器来使用字符流读取和写入信息。
ISO-8859-1
和UTF-8
。 - Jesper