一.OutputStreamWriter类
可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。
public static void main(String[] args) throws IOException { //指定目的地 FileOutputStream fos=new FileOutputStream("E:\java0929\UTF-8.txt",true); //创建转换流 OutputStreamWriter osw=new OutputStreamWriter(fos, "utf-8"); osw.write("你好,小猪佩奇"); osw.flush(); //释放资源(你自己new了谁,就关谁,先开的后关) osw.close(); fos.close(); }
在OutputStreamWriter流中维护自己的缓冲区,当调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。
二.InputStreamReader类
它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
public static void main(String[] args) throws IOException { //获取数据源 FileInputStream fis=new FileInputStream("E:\java0929\UTF-8.txt"); //创建转换流 InputStreamReader isr=new InputStreamReader(fis,"utf-8"); //开始读取 int len=0; while((len=isr.read())!=-1){ System.out.println((char)len); } //释放资源 isr.close(); fis.close(); }
注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。
三.转换流和子类区别
FileWriter是OutputStreamWriter子类
FileReader是InputStreamReader子类
OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。
FileWriter和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");
三句代码的功能相同,第三句最为方便
注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?
条件:①操作的是文件。②使用默认编码。
总结:
字节→字符 : 看不懂的→看的懂的。 需要读,输入流(InputStreamReader)
字符→字节 : 看的懂的→看不懂的。 需要写,输出流(OutputStreamWriter)