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

时间:2013-05-16 05:01:24

标签: java unicode utf-8 stream

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

InputStreamReader将从输入读取的字节转换为字符,而OutputStreamWriter将字符转换为字节输出。

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

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

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


修改 的: 我何时需要使用InputStreamReader和OutputStreamWriter转换字节和字符之间的流?


修改 的 在哪种情况下我应该关心编码方案?

2 个答案:

答案 0 :(得分:9)

要了解此目的,您需要牢记以下内容。在Java中charString用于表示为Unicode的“text”,bytebyte[]用于二进制数据。字节不是文本。字节可以表示编码的文本...但必须先进行解码,然后才能使用charString类型。

  

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

InputStreamReaderReader的子类,因此不是“要么......或......”。)

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

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

  

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

再次编码。如果要将文本写入OUtputStream,则必须根据某种编码方案对其进行编码; e.g。

    os.write(str.getBytes("UTF-8"));

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


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

答案 1 :(得分:1)

Reader/Writer读/写 字符串文字的API提供给流。 Inputstream/OutputStream未提供读取/写入 字符串文字,而是逐字节读取/写入

因此,如果您的程序需要读/写字符串,那么我建议使用Reader/Writer来简化

此外,Reader/Writer在内部使用InputStream/OutputStream,因此如果直接使用,Streams会读/写一点