目录
不同编码读取出现乱码的问题
转换流
InputStreamReader(字符输入转换流)
实例演示(1)
OutputStreamWriter(字符输出转换流)
实例演示(2)
不同编码读取出现乱码的问题
- 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码
- 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码
演示
先创建一个GBK编码的文件testFile.txt
读取:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;public class Test2 {public static void main(String[] args) {try(//1.创建一个文件字符输入流与源文件接通Reader fr = new FileReader("HelloWorld/src/testFile.txt");//文件编码:GBK//代码编码:UTF-8//2.把文件字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(fr);){String line;while( (line = br.readLine()) != null ){System.out.println(line);}}catch(Exception e){e.printStackTrace();}}
}
运行了会出现乱码:
为了解决这个问题,引出 字符转换流
转换流
转换流属于IO流体系中字符流的分支:字符输入流里面的字符输入转换流;字符输出流里面的字符输出转换流。
InputStreamReader(字符输入转换流)
- 解决不同编码时,字符流读取文本内容乱码的问题。
- 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。
构造器 | 说明 |
---|---|
public InputStreamReader(InputStream is) | 把原始的字节输入流,按照代码默认编码转成字符输入流(与直接用FileReader的效果一样) |
public InputStreamReader(InputStream is,String charset) | 把原始的字节输入流,按照指定字符集编码转成字符输入流(重点) |
实例演示(1)
import java.io.*;public class InputStreamReaderTest1 {public static void main(String[] args) {try(//1.得到文件的原始字节流(GBK的字节流形式)InputStream is = new FileInputStream("HelloWorld/src/testFile.txt");//2.把原始的字节输入流按照指定的字符集编码转换成字符输入流Reader isr = new InputStreamReader(is,"GBK");//3.把字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(isr);){String line;while( (line = br.readLine()) != null ){System.out.println(line);}}catch (Exception e){e.printStackTrace();}}
}
这样就可以读取出正确的结果了:
如果需要控制写出去的字符使用说明字符集编码,可以使用以下方法:
- 调用String提供的getBytes方法解决
String data = "当时只道是寻常"; byte[] bytes = data.getBytes("GBK");
- 使用"字符输出转换流"实现
OutputStreamWriter(字符输出转换流)
- 作用:可以控制写出去的字符使用什么字符集编码。
- 解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。
构造器 | 说明 |
---|---|
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流,按照代码默认编码转换成字符输出流。 |
public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流,按照指定编码转换成字符输出流(重点) |
实例演示(2)
import java.io.*;public class OutputStreamWriterTest1 {public static void main(String[] args) {//指定写出去的字符编码try(//1.创建一个文件字节输出流OutputStream os = new FileOutputStream("HelloWorld/src/testFile2.txt");//2.把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流Writer osw = new OutputStreamWriter(os,"GBK");//3.把字符输出流包装成缓冲字符输出流BufferedWriter bw = new BufferedWriter(osw);){bw.write("满城春色宫墙柳");bw.write("泪痕红浥鲛绡透");}catch (Exception e){e.printStackTrace();}}
}
END
学习自:黑马程序员——Java课程