6

Java 教程站点,我们知道InputStreamReader并且OutputStreamWriter可以在字节和字符之间转换流。

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

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

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

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


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


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

4

2 回答 2

9

要理解这样做的目的,您需要牢牢记住以下内容。在 Java中char,andString用于表示为 Unicode 的“文本”,and byteorbyte[]用于二进制数据。字节不是文本。字节可以表示编码的文本……但是必须先对它们进行解码,然后才能在它们上使用charandString类型。

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

InputStreamReader是 的子类Reader,所以它不是“要么......要么......”的情况。)

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

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

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

它的编码再次。如果要将文本写入 OUTputStream,则必须根据某种编码方案对其进行编码;例如

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

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


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

于 2013-05-16T05:26:49.440 回答
1

Reader/Writer提供 API 以将字符串文字读/写到流中。as不提供String literals的读/写,而是逐字节读/写。Inputstream/OutputStream

因此,如果您的程序需要读/写StringReader/Writer ,那么为了简单起见,我建议使用。

另外,在内部Reader/Writer使用,所以如果直接使用InputStream/OutputStreamStreams 读/写速度会快一点

于 2013-05-16T05:07:35.983 回答