参考[大佬的博客][https://blog.csdn.net/huang_xw/article/details/7340904]
分为两种:
- InputStreamReader 字节流转字符流
- OutputStreamWriter 字符流转字节流
![]()
*写入数据–>内存中的字符数据–>字符流–>OutputStreamWriter–>字节流–>网络传输(或文件保存)
读取数据<–内存中的字符数据<–字符流<–InputStreamReader<–字节流<–网络传输(或文件保存)
可以清楚地发现,不管如何操作,最终全部是以字节的形式保存在文件中或者进行网络传输。*
FileWriter和FileReader的说明
从JDK文档中可以知道FileOutputStream是OutputStream的直接子类。FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,而是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚的发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的。也就是说,传输或者从文件中读取数据的时候,文件里真正保存的数据永远是字节。
转换流的作用:
1. 如果目前所 获取到的是一个字节流需要转换字符流使用,这时候就可以使用转换流。 字节流—-> 字符流
2. 使用转换流可以指定编码表进行读写文件。
InputStreamReader构造函数可以传递字节流
很显然可以包装我们的字节流,自动的完成节流编码和解码的工作。
//使用输入字节流的转换流指定码表进行读取文件数据
public static void readTest2() throws IOException{
File file = new File("F:\\a.txt");
FileInputStream fileInputStream = new FileInputStream(file);
//创建字节流的转换流并且指定码表进行读取
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
char[] buf = new char[1024];
int length = 0;
while((length = inputStreamReader.read(buf))!=-1){
System.out.println(new String(buf,0,length));
}
}
**OutputStreamWriter** 只给了我们一个字节流 我们要用字符流来输出
//使用输出字节流的转换流指定码表写出数据
public static void writeTest2() throws IOException{
File file = new File("F:\\a.txt");
//建立数据的输出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//把输出字节流转换成字符流并且指定编码表。
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
outputStreamWriter.write("新中国好啊");//意思就是 字节流转换成字符流输出字符 但是最终还是以字节流形式保存的
//关闭资源
outputStreamWriter.close();
}
总结:
1、重点:操作的终端点实际上都是以字节的形式进行的。
2、FileWriter和FileReader两个子类的定义,其实是中间使用了转换类。
3. 可以使用缓冲流来
需要注意的事项
InputStreamReader、OutputStreamWriter实现从字节流到字符流之间的转换,使得流的处理效率得到提升,但是如果我们想要达到最大的效率,我们应该考虑使用缓冲字符流包装转换流的思路来解决问题。比如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static void readTest() throws IOException{
InputStream in = System.in; //获取了标准的输入流。
// System.out.println("读到 的字符:"+ (char)in.read()); //read()一次只能读取一个字节。
//需要把字节流转换成字符流。
InputStreamReader inputStreamReader = new InputStreamReader(in);
//使用字符流的缓冲类
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while((line = bufferedReader.readLine())!=null){
System.out.println("内容:"+ line);
}
}