字符转换流的概述与使用
1.不同编码读取出现乱码的问题
- 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码
- 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码
2.字符输入转换流
(1)作用:指定编码读。解决了不同编码读取数据,出现乱码的问题
(2)解决思路:先获取文件的原始字节流,再将其按真实的字符集编码成字符输入流,这样字符输入流中的字符就不乱码了
(3)构造器
- public InputStreamReader(InputStream is):把原始的字节输入流,按照代码默认编码转成字符输入流
- public InputStreamReader(InputStream is,String charset):把原始的字节输入流,按照指定字符集编码转成字符输入流
package com.demo09_IO流_字符输入转换流;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Demo {
public static void main(String[] args) throws Exception {
// //创建原始流,关联文件
// FileInputStream fis = new FileInputStream("day10\\Demo09.txt"); //Demo09文件是GBK
// //创建转换流,指定字符集
// InputStreamReader isr = new InputStreamReader(fis,"GBK");
// //创建缓冲流,提升效率
// BufferedReader br = new BufferedReader(isr);
//按照指定字符集编码GBK转成字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day10\\Demo09.txt"),"GBK"));
//按照代码默认编码转成字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day10\\Demo09.txt")));
//读数据并展示
System.out.println(br.readLine()); //Demo09字符集是GBK,Demo09字符集是GBK
//释放资源
br.close();
}
}
3.字符输出转换流
(1)作用:指定编码写,控制写出去数据的字符集
(2)解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,写出去的字符就会用该字符集编码了
(3)构造器
- public OutputStreamWriter(OutputStream os):可以把原始的字节输出流,按照代码默认编码转换成字符输出流
- public OutputStreamWriter(OutputStream os,String charset):可以把原始的字节输出流,按照指定编码转换成字符输出流
package com.demo10_IO流_字符输出转换流;
import java.io.*;
import java.nio.charset.Charset;
public class Demo1 {
public static void main(String[] args) throws Exception {
// //创建字节流,关联文件
// FileOutputStream fos = new FileOutputStream("day10\\Demo01.txt");
// //创建转换流,指定字符集写
// OutputStreamWriter osr = new OutputStreamWriter(fos,"GBK");
// //创建缓冲流,提升性能
// BufferedWriter bw = new BufferedWriter(osr);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("day10\\Demo01.txt"),"GBK"));
//写数据
bw.write("郝佳乐"); //郝佳乐,内容是GBK
//释放资源
bw.close();
}
}
(4)还可以调用String的getBytes方法,先指定字符集将数据编码,然后写出去
package com.demo10_IO流_字符输出转换流;
import java.io.*;
public class Demo2 {
public static void main(String[] args) throws Exception {
byte[] bytes = "郝佳乐".getBytes("GBK");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day10\\Demo02.txt"));
bos.write(bytes)
bos.close();
}
}
(5)JDK11开始,可直接使用字符流构造指定字符集,构造第二个参数,通过Charset的静态方法forName指定字符集
- public FileReader(String fileName,Charset charset) throws IOException
- public FileWriter(String fileName,Charset charset) throws IOException
package com.demo10_IO流_字符输出转换流;
import java.io.*;
import java.nio.charset.Charset;
public class Demo3 {
public static void main(String[] args) throws Exception {
//指定编码读
BufferedReader br = new BufferedReader(new FileReader("day10\\Demo08.txt", Charset.forName("GBK")));
System.out.println(br.readLine());
br.close(); //我是GBK字符集的文件
//指定编码写
BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\Demo03.txt",Charset.forName("GBK")));
bw.write("郝佳乐");
bw.close();
}
}