我什么时候应该使用InputStreamReader和OutputStreamWriter?

Zac*_*ary 6 java unicode stream utf-8

Java Tutorial站点,我们知道InputStreamReaderOutputStreamWriter可以在字节和字符之间转换流.

InputStreamReader将从输入读取的字节转换为字符,同时OutputStreamWriter将字符转换为字节以输出.

但什么时候应该使用这两个类?

我们Inputstream/OutputStream逐字节Reader/Writer输入/输出,逐字符输入/输出.

因此,当使用InputStreamReader从字节流输入字符时,为什么不直接使用Reader类(或其子类)来读取字符?为什么不直接使用OutputStream而不是OutputStreamWriter写字节?


编辑:我什么时候需要使用InputStreamReader和OutputStreamWriter在字节和字符之间转换流?


编辑: 在哪种情况下我应该关心编码方案?

Ste*_*n C 9

要了解此目的,您需要牢记以下内容.在Java中char,String用于表示为Unicode的"文本",bytebyte[]用于二进制数据.字节不是文本.字节可以表示编码文本...但是必须先解码它们才能使用charString键入它们.

因此,当使用InputStreamReader从字节流输入字符时,为什么不直接使用Reader类(或其子类)来读取字符?

(InputStreamReader是一个子类Reader,所以它不是"要么......或......".)

这个目的InputStreamReader是为了适应InputStream一个Reader.此适配器负责将文本从字节解码为包含Unicode代码点1的字符.

因此,当您有一个现有的InputStream(例如来自套接字)时,或者当您需要更多地控制编码方案的选择时,您将使用它.(重新使用后者 - 您可以直接使用打开文件FileReader,但是隐式使用文件的默认平台编码.通过使用FileInputStream - > InputStreamReader,您可以明确指定编码方案.)

为什么不使用OutputStream而不是OutputStreamWriter直接写入字节?

它的编码又来了.如果要将文本写入OUtputStream,则必须根据某种编码方案对其进行编码; 例如

    os.write(str.getBytes("UTF-8"));
Run Code Online (Sandbox Code Playgroud)

通过使用Writer,您可以将编码移动到不那么突兀的输出管道中,并且通常可以更有效地完成.


1 - 或更严格地说,是Unicode代码点的16位表示.