基本介绍
在Java 中,InputStreamReader 和 **OutputStreamWriter **是两个重要的转换流类,分别用于将字节流转换为字符流和将字符流转换为字节流。以下是它们的核心功能:
1.InputStreamReader:Reader 的子类,可以将 InputStream(字节流)包装成 Reader(字符流)
2.OutputStreamWriter:Writer 的子类,实现将 OutputStream(字节流)包装成 Writer(字符流)
3.当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
4.可以在使用时指定编码格式(比如 utf-8,gbk,gb2312,ISO8859-1等)
先来看一个例子
先看一个文件乱码问题,引出学习转换流的必要性
D盘有一个 a.txt 文件用ANSI编码

执行以下java代码会报错,编码格式不同
java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CodeQuestion {
public static void main(String[] args) throws IOException {
// 读取 D:\\a.txt 文件到程序
// 思路
// 1. 创建字符输入流 BufferedReader [处理流]
// 2. 使用 BufferedReader 对象读取 a.txt
// 3. 默认情况下,读取文件是按照 utf-8 编码
String filePath = "D:\\a.txt";
BufferedReader br = new BufferedReader(new FileReader(filePath));
String s = br.readLine();
System.out.println("读取到的内容: " + s);
br.close();
}
}
运行结果

解决方案如下
java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 将 FileInputStream 字节流 转成 InputStreamReader 字符流,指定编码 gbk/utf-8
*/
public class InputStreamReader_ {
public static void main(String[] args) throws IOException {
String filePath = "D:\\a.txt";
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");
// 把 InputStreamReader 传入 BufferedReader
BufferedReader br = new BufferedReader(isr);
/**
* 可以把以上两个语句合并
* BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk"));
*/
// 读取
String s = br.readLine();
System.out.println("读取的内容: " + s);
// 关闭外层流
br.close();
}
}
应用案例
编程将字节流 FileOutputStream 包装成(转换成)字符流 OutputStreamWriter,对文件进行写入(按照 gbk 格式,可以指定其他,比如 utf-8)
java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "D:\\hsp.txt";
String charSet = "gbk";
OutputStreamWriter obk = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
obk.write("我爱你,中国");
obk.close();
System.out.println("按照 " + charSet + " 保存文件成功");
}
}