说明:
在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
转换流操作文件示意图:
示例(使用转换流拷贝文件):
FileInputStream in = new FileInputStream("reader.txt");
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
FileOutputStream out = new FileOutputStream("writer.txt");
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();
这代码不是很平凡?为什么还要学字符转换流?
因为在学习I/O流的过程中很容易出现文本乱码现象
这个时候就需要使用转换流进行修改,使其编码一致。
package liu;
import java.io.*;
//转换流只适合文本文件
public class ZhuanHuanLiu {
public static void main(String[] args) throws IOException {
//转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
osw.write("但是我还是一个孩子");
osw.flush();
osw.close();
FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
int len= 0 ;
char [] c = new char[1024];
while((len = isr.read())!=-1) {
System.out.print((char)len+" ");
}
}
}
上面的代码是通过参数都使用UTF-8格式,确保输入输出的格式相同,所以不会出现乱码的现象
package liu;
import java.io.*;
public class ZhuanHuanLiu2 {
public static void main(String[] args) throws IOException {
//转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
//BufferedWriter bw = new BufferedWriter(osw);
String str = "但是我还是一个孩子" ;
osw.write(str.toCharArray());
osw.flush();
osw.close();
FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
InputStreamReader isr = new InputStreamReader(fis,"gbk");
int len= 0 ;
char [] c = new char[1024];
while((len = isr.read(c))!=-1) {
System.out.print(new String(c,0,len));
}
isr.close();
}
}
上面的代码先写,再读,使用的都是gbk格式,保证编码格式的一致性
package liu;
import java.io.*;
public class ZhuanHuanLiu3 {
public static void main(String[] args) throws IOException {
//转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
BufferedWriter bw = new BufferedWriter(osw);
String str = "但是我还是一个孩子" ;
bw.write(str);
bw.flush();
bw.close();
FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
InputStreamReader isr = new InputStreamReader(fis,"gbk");
BufferedReader br = new BufferedReader(isr);
String len= null ;
while( (len = br.readLine()) !=null) {
System.out.println(len);
}
br.close();
}
}
上面的代码使用了缓冲流的原理,更加方便(可以使用readline()方法)