OutputStreamWriter类 OutputStreamWriter是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码乘字节。
代码演示:
public static void writeCN() throws Exception { //创建与文件关联的字节输出流对象 FileOutputStream fos = new FileOutputStream("c:\\cn8.txt"); //创建可以把字符转成字节的转换流对象,并指定编码 OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); //调用转换流,把文字写出去,其实是写到转换流的缓冲区中 osw.write("你好");//写入缓冲区。 osw.close(); }
在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。
InputStreamReader类 InputStreamReader是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码成字符,它使用的字符集可以用名称指定或显示给定,或者可以接受平台默人的字符集。
代码演示:
public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { //演示字节转字符流的转换流 readCN(); } public static void readCN() throws IOException{ //创建读取文件的字节流对象 InputStream in = new FileInputStream("c:\\cn8.txt"); //创建转换流对象 InputStreamReader isr = new InputStreamReader(in,"utf-8"); //使用转换流去读字节流中的字节 int ch = 0; while((ch = isr.read())!=-1){ System.out.println((char)ch); } //关闭流 isr.close(); } }
注意:在读取指定的编码文件时,一定要指定编码格式,否则会发生解码错误,从而发生乱码现象。
转换流和子类的区别
OutputStreamWriter和InputStreamReader是字符和字节的桥梁,也可以称之为字节转换符。字节转换流原理:字节表+编码表。
FileWrite和FileReader作为子类,仅作为操作字符文件的便捷类存在,当操作的字符文件使用的是默认编码表时就可以不用父类,直接用子类就完成操作,简化了代码。
例: InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("a.txt");
以上三句代码的功能是一模一样的,其中第三局最便捷。
注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。
使用子类的条件:
1、操作的是文件 2、使用默认编码