一、转换流
1、引出问题:不同编码读取时会乱码
(1)如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
(2)如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!
1.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/Test1.java
package com.itheima.d3_transform_stream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
/**
* 目标:掌握不同编码读取乱码的问题
*/
public class Test1 {
public static void main(String[] args) {
try (
// 1、创建一个文件字符输入流与源文件截图
// 代码编码:utf-8,文件的编码:utf-8
Reader fr = new FileReader("study18-io-app2/src/itheima06.txt");
// 2、把文件字符输入流包装成缓冲字符输入流
BufferedReader br = new BufferedReader(fr);
) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、字符输入转换流
2.1、InputStreamReader(字符输入转换流)
(1)解决不同编码时,字符流读取文本内容乱码的问题。
(2)解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了

2.1.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/InputStreamReaderTest2.java
package com.itheima.d3_transform_stream;
import java.io.*;
/**
* 目标:掌握字符输入转换流的作用
*/
public class InputStreamReaderTest2 {
public static void main(String[] args) {
try (
// 1、得到文件的原始字节流(GBK的字节流形式)
InputStream is = new FileInputStream("study18-io-app2/src/itheima07.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();
}
}
}
3、字符输出转换流
3.1、需要控制写出去的字符使用什么字符集编码,该咋整?
(1)调用String提供的getBytes方法解决?
String data="我爱你中国abc";
byte[] bytes = data.getBytes("GBK");
(2)使用”字符输出转换流”实现。
3.2、OutputStreamWriter字符输出转换流
(1)作用:可以控制写出去的字符使用什么字符集编码,
(2)解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。

3.2.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/OutputStreamWriterTest3.java
package com.itheima.d3_transform_stream;
import java.io.*;
/**
* 目标:掌握字符输出转换流的使用
*/
public class OutputStreamWriterTest3 {
public static void main(String[] args) {
// 指定写出去的字符编码
try ( // 放在小括号里面的原因是自动完成资源的释放
// 1、创建一个文件字节输出流
OutputStream os = new FileOutputStream("study18-io-app2/src/itheima08out.txt");
// 2、把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。
Writer osw = new OutputStreamWriter(os, "utf-8");
// 3、把字符输出流包装成缓冲字符输出流
BufferedWriter bw = new BufferedWriter(osw)
) {
bw.write("我是这个人dada");
bw.write("我是发射点发生这个人sdfs");
} catch (Exception e) {
e.printStackTrace();
}
}
}
浙公网安备 33010602011771号