字符编码和字符集:
编码:按照某种规则,将字符存储到计算机中称为编码
解码:将存储在计算机中的二进制数按照某种规则解析出来称为解码。
字符编码:就是一套自然语言的字符与二进制数之间的对应规则。
字符集:CharSet也叫编码表。是一个系统支持的所有字符的集合。
ASCII字符集、ISO-8859-1字符集、GBxxx字符集、Unicode字符集(万国码):UTF-8
编码引出的问题_FileReader读取GBK:
/* * FileReader可以读取默认编码格式(UTF-8)的文件 * FileReader读取系统默认编码(中文GBK)会产生乱码 * */ public class Demo01FileReader { public static void main(String[] args) throws IOException { FileReader fr=new FileReader("IO\\我是GBK格式的文本.txt"); int len=0; while((len=fr.read())!=-1){ System.out.println((char)len);//��� } fr.close(); } }
转换流的原理:
GBK 中文码表 使用两个字节存储一个中文 你好--》-55,-44,-33-34
UTF-8 国际标准码表 使用三个字节存储一个中文 你好--》-11-12-23,-19-56-78
InputStreamReader:是从字节流到字符流的桥,可以查询默认码表,也可以指定编码表,将FileInputStream读取的字节流进行相应的转换。
OutputStreamWriter:是字符的桥梁流以字节流,查询默认码表或者指定编码表,把字符转换为想要的字节,然后再由FileOutputStream输出相应的字节流。
OutputStreamWriter介绍&代码实现:
/* * java.io.OutputStreamWriter extends Writer * OutputStreamWriter是字符通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节(编码:把能看懂的变成看不懂的) * 继承自父类的共性成员方法: * void write(int c) 写一个字符 * void write(char[] cbuf) 写入一个字符数组。 * void write(char[] cbuf, int off, int len) 写入字符数组的一部分。 * void write(String str) 写一个字符串 * void write(String str, int off, int 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.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称 * 2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储到缓冲区中(编码)。 * 3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) * 4.释放资源 * */ public class Demo02OutputStreamWriter { public static void main(String[] args) throws IOException { //write_utf_8(); write_gbk(); } /* * 使用转换流写GBK格式的文件*/ private static void write_gbk() throws IOException { OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("IO\\gbk.txt"),"gbk"); osw.write("你好,世界!"); osw.flush(); osw.close(); } /* * 使用转换流OutputStreamWriter写UTF-8格式的文件 * */ private static void write_utf_8() throws IOException { //OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("IO\\utf_8.txt"),"utf-8"); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("IO\\utf_8.txt"));//不指定默认使用UTF-8 osw.write("你好,世界"); osw.flush(); osw.close(); } }
InputStreamReader介绍&代码实现:
/* * java.io.InputStreamReader extends Reader * InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。(解码:把看不懂的变成能看懂的) * 继承自父类的成员方法: * int read() 读取单个字符并返回。 * int read(char[] cbuf) :一次读取多个字符,将字符读入数组 * void close() :释放资源 * 构造方法: * InputStreamReader(InputStream in) :创建一个使用默认字符集的InputStreamReader * InputStreamReader(InputStream in, String charsetName) :创建一个使用命名字符集的InputStreamReader。 * 参数: * InputStream in:字节输入流,用来读取文件中保存的字节。 * String charsetName:编码表名称 * 使用步骤: * 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 * 2.使用InputStreamReader对象中的方法read读取文件 * 3.释放资源 * 注意事项: * 构造方法中指定的编码表名称吆喝文件的编码相同,否则会发生乱码 * */ public class Demo03InputStreamReader { public static void main(String[] args) throws IOException { //read_utf_8(); read_gbk(); } /* * 使用InputStreamReader读取GBK格式的文件 * */ private static void read_gbk() throws IOException { InputStreamReader isr=new InputStreamReader(new FileInputStream("IO\\gbk.txt"),"gbk"); //InputStreamReader isr=new InputStreamReader(new FileInputStream("IO\\gbk.txt"));//��ã�����! int len=0; while((len=isr.read())!=-1){ System.out.print((char)len); } isr.close(); } /* * 使用InputStreamReader读取UTF-8格式的文件 * */ private static void read_utf_8() throws IOException { //InputStreamReader isr=new InputStreamReader(new FileInputStream("IO\\utf_8.txt"),"utf-8"); InputStreamReader isr=new InputStreamReader(new FileInputStream("IO\\utf_8.txt"));//默认使用utf-8 int len=0; while((len=isr.read())!=-1){ System.out.print((char)len); } isr.close(); } }
练习_转换文件编码:
/* * 练习:转换文件编码 * 将GBK编码的文本文件,转换为UTF-8编码的文本文件 * 分析: * 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK * 2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8 * 3.使用InputStreamReader中的方法read读取文件 * 4.使用OutputStreamWriter中的方法write,把读取的数据写入到文件中 * 5.释放资源 * */ public class Demo04Practice { public static void main(String[] args) throws IOException { InputStreamReader isr=new InputStreamReader(new FileInputStream("IO\\我是GBK格式的文本.txt"),"gbk"); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("IO\\我是utf-8格式的文件.txt"),"utf-8"); int len=0; while((len=isr.read())!=-1){ osw.write(len); } osw.close(); isr.close(); } }