background image

这里可以总结一下,InputStream 中的字节编码取决文件本身的编码,而 OutputStream 生
成文件的编码取决于字节的编码。

 

下面说说采用字符输入流来读取文件。

首先,我们需要理解一下字符流。其实字符流可以看做是一种包装流,它的底层还是采用
字节流来读取字节,然后它使用指定的编码方式将读取字节解码为字符。说起字符流,不
得不提的就是 InputStreamReader。以下是 java api

 

对它的说明: InputStreamReader 是字节

 

流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符
集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说到这里其实很明白了,
InputStreamReader 在底层还是采用字节流来读取字节,读取字节后它需要一个编码格式
来解码读取的字节,如果我们在构造 InputStreamReader 没有传入编码方式,那么会采用
操作系统默认的 GBK 来解码读取的字节。还用上面 demo.txt 的例子,假设 demo.txt 编码方
式为 GBK,我们使用如下代码来读取文件:

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”));

那么我们读取不会产生乱码,因为文件采用 GBK 编码,所以读出的字节也是 GBK 编码
的,而 InputStreamReader 默认采用解码也是 GBK。如果把 demo.txt 编码方式换成 UTF-8,
那么我们采用这种方式读取就会产生乱码。这是因为字节编码(UTF-8)和我们的解码编码
(GBK)造成的。解决办法如下:

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

给 InputStreamReader 指定解码编码,这样二者统一就不会出现乱码了。

 

下面说说字符输出流。

字符输出流的原理和字符输入流的原理一样,也可以看做是包装流,其底层还是采用字
节输出流来写文件。只是字符输出流根据指定的编码将字符转换为字节的。字符输出流的
主要类是:OutputStreamWriter。Java api 解释如下:OutputStreamWriter 是字符流通向字节

 

流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由
名称指定或显式给定,否则可能接受平台默认的字符集。说的很明白了,它需要一个编码
将写入的字符转换为字节,如果没有指定则采用 GBK 编码,那么输出的字节都将是
GBK 编码,生成的文件也是 GBK 编码的。如果采用以下方式构造 OutputStreamWriter:

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);

那么写入的字符将被编码为 UTF-8 的字节,生成的文件也将是 UTF-8 格式的。