为什么需要使用转换流
//FileReader和BufferedReader从文本文件中读取数据时使用码表默认是GBK码表,不能修改, //如果文本文件的编码不是GBK时,就不能使用GBK方式去读取,否则会出现乱码, //此时需要指定编码去读取文件的内容,只能使用转换流,只有转换流才能指定码表。
转换流概述
本质就是字符流,只能操作文本文件。
转换流的作用
字节流和字符流相互转换的桥梁。
转换流的分类
OutputStreamWriter
InputStreamReader
OutputStreamWriter类概述
* 继承Writer类 * 本质是一个字符流,只能操作文本文件。 * 是字符流通向字节流的桥梁。
OutputStreamWrtier类构造方法
OutputStreamWriter(OutputStream out) * 根据字节流创建字符转换输出流。使用默认码表:GBK * 可以传递的字节输出流:FileOutputStream,BufferedOutputStream OutputStreamWriter(OutputStream out, String charsetName) * 根据字节流创建字符转换输出流。可以通过charsetName指定码表 * 可以传递的字节输出流:FileOutputStream,BufferedOutputStream
OutputStreamWrtier类成员方法
write(); 可以输出一个字符,字符数组,字符串。
字符流转字节流的过程
* 先通过OutputStreamWrtier类查询指定的码表,将要输出的内容转换字节 * 然后将转换到的字节交给OutputStream字节输出流输出到目标文件中。
public class OutputStreamWriterDemo { public static void main(String[] args) { writeGBK(); writeUTF8(); } // 使用UTF8方式输出数据 public static void writeUTF8() { try( // 创建字符转换输出流对象 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt"),"UTF-8"); ){ // 调用方法输出数据 osw.write("你好"); }catch(Exception e) { } } // 使用GBK方式输出数据 public static void writeGBK() { try( // 创建字符转换输出流对象 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt")); ){ // 调用方法输出数据 osw.write("你好"); }catch(Exception e) { } } }
InputStreamReader类概述
继承Reader,本质就是一个字符输入流。只能从文本文件中读取数据。 是字节流转字符流的桥梁。
InputStreamReader类构造方法
InputStreamReader(InputStream in); 使用默认码表:GBK 创建字符转换输入流对象 InputStreamReader(InputStream in,String charsetName); 使用指定码表创建字符转换输入流对象。
InputStreamReader类成员方法
read(); 可以读取一个字符,一个字符数组
字节流转字符流的过程
* 先由InputStream的对象去从目标文件中读取数据,读取到的都是字节数 * 然后将读取到的字节交给InputStreamReader的对象去查询指定的码表得到对应字符。
public class InputStreamReaderDemo { public static void main(String[] args) { readGBK(); readUTF8(); } /** * 使用UTF8方法读取文本文件内容 */ private static void readUTF8() { try( // 创建字符转换输入流对象 InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"),"utf8"); ){ // 定义字符数组 char[] buf = new char[1024]; // 读取内容 int len = isr.read(buf); System.out.println(new String(buf,0,len)); }catch(Exception e) {} } /** * 使用GBK方法读取文本文件内容 */ private static void readGBK() { try( // 创建字符转换输入流对象 InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"),"GBK"); ){ // 定义字符数组 char[] buf = new char[1024]; // 读取内容 int len = isr.read(buf); System.out.println(new String(buf,0,len)); }catch(Exception e) {} } }