转换流的原理与OutputStreamWriter介绍&代码实现与OutputStreamWriter介绍&代码实现
作者:互联网
转换流的原理-InputStreamReader-OutputStreamWriter
编码引出的问题 --FileReader读取GBK格式的文件 会乱码 相当于ide默认的utf-8读取GBK编码的汉字 表示的字节不同会报错
FileReader可以读取IDE默认编码格式UTF-8的文件,
但是FileReader读取系统默认编码(中文系统默认GBK格式)会产生乱码
package Synchronized_demo.Synchroned_Demo01; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; /* FiLeReader可以读取IDE黑默t认编码格式(UTF-8)的文件FiLeReaderi读取系统黑认编码(中文GBK)会产生乱码 */ public class Demo01_Dewl { public static void main(String[] args) throws IOException { FileReader reader = new FileReader("G:\\xiangmu\\jichu\\wenjianjia\\b.txt"); int len = 0; while ((len = reader.read())!=-1){ System.out.println((char) len); } reader.close(); } }
注意:
FileReader
1.其实所有的底层都是FileInputStream来读的,先读取到字节 再FileReader(这个时候用的UTF-8来解码的来read的)把字节转换为字符(相当于解码)
但是如果存储的是GBK格式,则FileInputStream读取的字节时Gbk格式 但是FileReader仍然用UTF-8来,则会产生乱码(编码和解码不对应,会乱码所以FileReader只能读取ide默认格式编码的文件)
不用FileReader读了用InputStreamReader来读既可以查询默认的UTF-8又可以查询指定的码表比如GBK或者其他的
2.FileWriter
只能查询Ide的默认码表,吧字符转换为字节(编码把看懂的转换成看不懂的)还是会用到FileOutputStream依次把字节写入到硬盘中(只能写Utf-8)
如果要写GBK格式的文件
用OutputStreamWriter 既可以把字符转化为默认的又可以转化为指定的码表 ,然后FileOutputStream写入到硬盘中(注意FileOutputStream只能写UTF-8)
public class InputStreamReader extends Reader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用InputStreamReader中的一个read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
package Synchronized_demo; import java.io.*; /* java.io.Outputstreamlwriter extends writer outputstreamwnriter:是字符流通向字节流的桥梁:可使用指定的 charset将要写入流中的字符编码成字节。(编码:把能看懂的变成看不懂)继续自父类的共性成员方法: - void write(int c)写入单个字符。 - void write( char[ ] cbuf)写入字符数组。 - abstractvoid write(char[ ] cbuf,int off, int Len)写入字符数组的某一部分, off数组的开始索引,Len写的字符个数。- void iwrite( String str)写入字符串。 - void write(String str,int off, int len)写入字符串的某一部分, off字符串的开始索引, Len写的字符个数。- void flush()刷新该流的缓冲。 - void close()关闭此流,但要先刷新它。构造方法: outputStreamwriter(OutputStream out)创建使用认字符编码的outputStreamwriter。 outputStreamwriter(OutputStream out,String charsetName)创建使用指定字符集的 outputStreamwriter。参数: outputstream out:字节输出流,可以用来写转换之后的字节到文件中 String charsetName :指定的编码表名称,不区分大小写,可以是utf-8/UTF-8, gbk/GBK,. ..不指定默认使用UTF-8 使用步骤: 1.创建outputStreamlwriter对象,构造方法中传递字节输出流和指定的编码表名称 2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码) 3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) 4.释放资源 */ public class Demo02OutStreamWitrew { public static void main(String[] args) throws IOException { //write_utf_8(); write_GBK(); } /* 使用转换流outputstreamwriter写GBK格式的文件 */ private static void write_GBK() throws IOException { //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称 OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\a.txt"),"GBK"); //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码) os.write("你不好"); //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) os.flush(); //4.释放资源 os.close(); } /* 使用转换流outputstreamwriter写UTF-8格式的文件 */ private static void write_utf_8() throws IOException { //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称 OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\b.txt"),"UTF-8"); //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码) os.write("你不好"); //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) os.flush(); //4.释放资源 os.close(); } }
标签:编码,OutputStreamWriter,字节,字符,FileReader,代码,GBK,介绍,write 来源: https://www.cnblogs.com/x3449/p/16473361.html