- (一)问题引出:不同编码读取乱码问题
- (1)使用字符流读取中文是否有乱码?
- (2)如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
- (二)字符输入转换流
- (1)引入
- (2)字符输入转换流简述
- (3)字符输入转换流InputStreamReader作用
- (4)具体使用
- (三)字符输出转换流
- (1)引入
- (2)字符输出转换流
- (3)字符输出转换流OutputStreamWriter的作用
- (4)具体使用
●没有的,因为代码编码和文件编码都是UTF-8。
(2)如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?●会乱码
●文件编码和读取的编码必须一致才不会乱码。
①如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
●会乱码
②如何解决呢?
●使用字符输入转换流
●可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
●然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
●字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流
| 构造器 | 说明 |
|---|---|
| public InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样 |
| public InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点) |
●可以解决字符流读取不同编码乱码的问题
●public InputStreamReader(InputStream is,String charset):
可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。
public class InputStreamReader {
public static void main(String[] args) throws Exception {
// 代码UTF-8 文件 GBK "E:JAVA学习资料Day26.txt"
// 1、提取GBK文件的原始字节流。
InputStream is = new FileInputStream("E:\JAVA学习资料\Day26.txt");
// 2、把原始字节流转换成字符输入流
// Reader isr = new InputStreamReader(is); // 默认以UTF-8的方式转换成字符流,会乱码的,跟直接使用FileReader是一样的
Reader isr = new java.io.InputStreamReader(is , "GBK"); //以指定的GBK编码转换成字符输入流 解决了乱码问题
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
}
}
}
(三)字符输出转换流
(1)引入
①如果需要控制写出去的字符使用的编码,怎么办?
●可以把字符以指定编码获取字节后再使用字节输出流写出去:
“哈哈哈哈”.getBytes(编码)
●也可以使用字符输出转换流实现。
●字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。
| 构造器 | 说明 |
|---|---|
| public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用。 |
| public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照指定编码转换成字符输出流(重点) |
●public OutputStreamWriter(OutputStream os,String charset)
●可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!
输出的变成了乱码,说明了字符输出转换流OutputStreamWriter,成功的由UTF—8,变为了GBK



