转换流
(一)问题引出:不同编码读取乱码问题
(1)使用字符流读取中文是否有乱码?
●没有的,因为代码编码和文件编码都是UTF-8。
(2)如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
●会乱码
●文件编码和读取的编码必须一致才不会乱码。
(二)字符输入转换流
(1)引入
①如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
●会乱码
②如何解决呢?
●使用字符输入转换流
●可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
●然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
(2)字符输入转换流简述
●字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流
构造器 | 说明 |
---|---|
public InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样 |
public InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点) |
(3)字符输入转换流InputStreamReader作用
●可以解决字符流读取不同编码乱码的问题
●public InputStreamReader(InputStream is,String charset):
可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。
(4)具体使用
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(编码)
●也可以使用字符输出转换流实现。
(2)字符输出转换流
●字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。
构造器 | 说明 |
---|---|
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用。 |
public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照指定编码转换成字符输出流(重点) |
(3)字符输出转换流OutputStreamWriter的作用
●public OutputStreamWriter(OutputStream os,String charset)
●可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!
(4)具体使用
输出的变成了乱码,说明了字符输出转换流OutputStreamWriter,成功的由UTF—8,变为了GBK