转换流
字符编码:
编码:按照某种规则,将字符存储到计算机中(字符->二进制);
解码:将存储在计算机中的二进制数据按某种规则解析出来(二进制->字符)
字符编码:一套自然语言的字符与二进制之间的规则
字符集:是一个系统支持所有字符的集合,包括各个国家的文字、标点符号、图形符号和 数字等;
常见的编码表和字符集对应关系
1.ASCII编码表——ASCII字符集
2.GBK编码表——GBK字符集
3.UTF—8编码表,UTF—16编码表,UTF—32编码表 (UTF—8编码表最为常用)
三个编码表对应的都是Unicode字符集
(不同的字符采用不同的字节,
在UTF—8中,123个ASCII字符只需要一个字节编码,拉丁文等字符需要两个字节编码,大部分常用字如中文用3个字节编码,其他极少使用的字符使用四字节编码)
编码产生的问题:
FileReader可以读取IDE默认格式(UTF—8)的文件,当读取系统默认编码(GBK)时会产生乱码,使用转换流可解决该问题。
1.OutputStreamWriter
是字符流通向子节流的桥梁可用指定编码表将要写入的数据编码成字节
方法:write、flush、close
构造方法:
OutputStreamWriter(OutputStream out)
使用默认编码表;
OutputStreamWriter(OutputStream out , String charsetName)
创建指定编码表;
参数:out:字节输出流,可以写转换之后的字节到文件中
charsetName:指定编码表名称,不区分大小写
使用步骤:
1.创建对象,在构造方法中传递字节输出流和指定编码表
2.使用write方法,把字符转化为字节存储到缓冲区中(编码)
3.使用flush方法,把内存缓冲区数据刷新到文件
4.释放资源
2.InputStreamReader
是字节流通向子符流的桥梁可用指定编码表读取字节并将其解码为字符
方法:read、close
构造方法:
InputStreamReader(InputStream in)
使用默认编码表;
InputStreamReader(InputStream in , String charsetName)
创建指定编码表;
参数:out:字节输出流,可以写转换之后的字节到文件中
charsetName:指定编码表名称,不区分大小写
使用步骤:
1.创建对象,在构造方法中传递字节输入流和指定编码表
2.使用read方法,读取文件
3.释放资源
代码练习
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class DemoTransform04 { public DemoTransform04() { } public static void main(String[] args) throws IOException { read_gbk("Month\src\LearnIO2\obj.txt"); } //使用GBK编码表写入文件数据 public static void write_gbk(String pathnanme) throws IOException { File file = new File(pathnanme); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk"); osw.write("空山新雨后,天气晚来秋"); osw.flush(); osw.close(); } //读一个GBK编码表的文件 public static void read_gbk(String pathname) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream(pathname), "gbk"); char[] chars = new char[11]; boolean var3 = false; while(isr.read(chars) != -1) { System.out.println(chars); } isr.close(); } //使用UTF-8编码表写入文件数据 public static void write_utf_8(String pathnanme) throws IOException { File file = new File(pathnanme); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); osw.write("空山新雨后,天气晚来秋"); osw.flush(); osw.close(); } }