IO

    技术2023-10-30  104

    字符编码和字符集 字符编码:自然语言的字符与二进制直接的对应规则 编码:字符 ——> 字节(看不懂) 解码:字节 ——> 字符(能看懂)字符集:编码表,是一个系统支持的所有字符的集合,包括各个国家文字,标点符号,图形符号,数字等 编码引出的问题: FileReader可以读取默认编码格式(utf-8)的文件 FileReader读取系统默认编码(中文GBK)会产生乱码 解决:使用转换流转换流的原理: GBK:中文码表,使用两个字节存储一个中文 UTF-8:国际标准码表,使用三个字节存储一个中文 可以指定字符集进行编码或者解码。
    OutputStreamWriter java.io.OutputStreamWriter extends writer

    OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节.(编码)

    继承自父类的共性成员方法: void write(char[] cbuf) 写入字符数组。 abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 void write(int c) 写入单个字符。 void write(String str) 写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分 abstract void close() 关闭此流,但要先刷新它。 abstract void flush() 刷新该流的缓冲。

    构造方法: OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter

    参数: OutputStream out:字节输出流,可以用来写转换之后的字节到文件中 String charsetName:编码表名称,不区分大小写,不知道则使用默认编码

    使用步骤: 1 创建一个OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码名称 2 使用OutputStreamWriter对象中的方法write,把字符转换为字节存储到缓冲区中(编码) 3 使用OutputStreamWriter对象中的方法flush,把缓冲区中的字节刷新到文件中(使用字节流写字节的过程) 4 释放资源

    public class demo02OutputStreamWriter { public static void main(String[] args) throws IOException { Write_utf_8(); } //使用转换流OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称 private static void Write_utf_8() throws IOException { //不指定也是默认utf-8 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\utf-8.txt")); //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\gbk.txt"),"gbk"); osw.write("你好"); osw.flush(); osw.close(); } }
    InputStreamReader java.io.InputStreamReader extends Reader

    InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符(解码)

    继承自父类的共性成员方法: int read() 读取单个字符。 int read(char[] cbuf) 将字符读入数组 abstract 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_utf8(); System.out.println(""); read_gbk(); } private static void read_gbk() throws IOException { //不指定编码表,会乱码,因为文件编码格式是gbk InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\gbk.txt"),"gbk"); int len = 0; while((len = isr.read()) != -1) { System.out.print((char)len); //你好 } isr.close(); } private static void read_utf8() throws IOException { //不指定编码表,默认使用utf-8 InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\utf-8.txt")); 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 demo04ChangeCharset { public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\gbk.txt"),"gbk"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Eclipse\\workplace\\day1\\src\\num12\\utf-8.txt"),"utf-8"); int len = 0; while((len = isr.read()) != -1) { osw.write(len); } osw.close(); isr.close(); } }
    Processed: 0.012, SQL: 10