它是字节流和字符流之间转换的桥梁
转换流本身其实是字符流;
转换流的位置:
分为两个:
字符转换输入流:InputStreamReader
将InputStream转换为Reader
字符转换输出流:OutputStreamWriter
将Writer转换为OutputStream
作用:
- InputStreamReader可将字节流先转换为字符流
- 可以指定字符集读写
- 可使用字符流中的方法了
- OutputStreamWriter可将字符流转为字节流
用两个练习了解转换流:
练习一:
需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码
1.首先准备一段用GBK编码的文本
放在idea中会乱码,因为idea默认使用UTF-8编码规则
2.题目要求不能出现乱码,我们可以使用字符流
题解:方法一、二
/*需求1:手动创建一个gbk的文件,把文件中的中文读取到内存中,不能出现乱码*/
//需求1:
//方法一:使用转化流(已过时)----
//第一个参数要创建对应的字节流对象,第二个参数要,要指定和文本编码规则相同的解码规则---GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("..\\ioDemo\\gbkfile.txt"), "GBK");
//读取数据
int b;
while ((b = isr.read()) != -1) {
System.out.print((char) b);
}
isr.close();
System.out.println();
System.out.println("--------------");
//方法二:底层就是调用转换流
//参数1:放要读取的文件,
//参数2:调用forName方法指定解码规则GBK
FileReader fr=new FileReader("..\\ioDemo\\gbkfile.txt", Charset.forName("GBK"));
int c;
while((c=fr.read())!=-1){
System.out.print((char) c);
}
fr.close();
控制台:
终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉终于为那一身江南烟雨覆了天下
容华谢后,不过一场
今日无事,戏院听曲,插花弄玉
需求2:把一段中文按照gbk的方式写到本地文件
//方法一:
/*//创建转化流对象
//第一个参数要创建对应的字节流对象,第二个参数指定要写出的格式
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\a.txt"),"GBK");
//写出数据
osw.write("你好世界");
//关流
osw.close();*/
//方法二:使用字符流,底层是使用转换流
//创建字符流对象
FileWriter fw=new FileWriter("..\\ioDemo\\a.txt", Charset.forName("GBK"));
fw.write("你好世界");
fw.close();
结果:
因为idea默认是UTF-8的解码方式,所以GBK格式的文本会出现乱码
需求3:将需求2的gbk文件,转成utf-8
思路:先用GBK解码规则读取GBK文件,然后用UTF-8编码方式写出文件
//方法一:
//创建转换流输入对象------读时候用GBK
/* InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\ioDemo\\a.txt"),"GBK");
//创建转换流输出对象------输出时候用UTF-8
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\ioDemo\\example.txt"),"UTF-8");//因为idea默认使用UTF-8所以可不写
//读写
int b;
while((b=isr.read())!=-1){
osw.write(b);
}
//关流
osw.close();
isr.close();*/
//方法二:
//使用字符流,底层是使用转换流
FileReader fr=new FileReader("..\\ioDemo\\a.txt",Charset.forName("GBK"));
FileWriter fw=new FileWriter("..\\ioDemo\\example.txt",Charset.forName("UTF-8"));因为idea默认使用UTF-8所以可不写
int b;
while((b=fr.read())!=-1){
fw.write(b);
}
fw.close();
fr.close();
a.txt:
example.txt:
练习二:
问题:
1.字节流读取中文数据会有乱码—使用字符流解决
2.字节流没有读取一行数据的方法----使用字符字符缓冲流解决
思路:先将字节流 转为字符流 再转为字符缓冲流
//创建字节流对象
FileInputStream fis=new FileInputStream("..\\ioDemo\\csb2.txt");
//创建转换流对象----将字节流转成字符流 转化流其实就是字符流所以可放入BufferedReader参数
InputStreamReader isr=new InputStreamReader(fis);
//将字符流包装成字符缓冲流
BufferedReader br=new BufferedReader(isr);
//循环读取每一行
String s ;
while((s= br.readLine())!=null){
System.out.println(s);
}
//关流
br.close();
csb2.txt:
读取结果: