一、知识点介绍
1.为什么要学转换流?
答:因为在不同的文件读取中,可能因为编码的不兼容读取会出现乱码的问题。比如本身的idea是UTF-8的,要去读取一个系统的GBK文件,就会出现乱码问题。那么用转换流就可以解决这个问题。
2.怎么解决?
答:文件---原始字节流---字符流(编码转换--读写的文件编码是格式就转换成什么格式)---缓冲流(和缓冲流后续步骤一样)。
为什么要先转换成原始字节流?
答:因为数据的底层都是原始字节流,这样就可以获取原始字节数据,不会产生乱码的问题。
3.具体实现?
答:创建读写文件地址后,下一步就进行编码转换。接着加入缓冲流步骤。后续的和缓冲流一样。
二.代码实现
1.字符转换输入流(读取数据)------InputStreamReader
需求:读取一个UTF-16LE编码的文件。读取里面的内容出来。
素材
代码例子
package bao; import java.io.*; public class Test { public static void main(String[] args) throws Exception { //1.创建要读取的文件对象 InputStream in = new FileInputStream("D:\\诗情画意.txt"); //2.把原始字节转换成字符输入流 InputStreamReader isr = new InputStreamReader(in,"UTF-16LE");//转换格式(要读取的文件什么格式就输入什么格式) //3.加上字符缓冲流 BufferedReader br = new BufferedReader(isr); String line;//缓冲桶 while ((line=br.readLine())!=null){//读取文件数据内容 System.out.println(line);//输出 } br.close();//关闭流 } }
运行结果:
问世间,情是何物,直教生死相许。love 99
2.字符转换输出流(写入数据)-----OutputStreamWriter
需求:往一个文件里面写入数据,文件的编码要为UTF-16LE 。
package bao; import java.io.*; public class Test { public static void main(String[] args) throws Exception { //1.创建往指定的文件里面写入数据的对象 OutputStream out = new FileOutputStream("D:\\诗情画意1.txt"); //2.原始字节转换成字符输出流 OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-16LE");//转换成和文件编码一致的编码(文件编码是什么,这里就是什么) //3.加上字符缓冲输出流 BufferedWriter bw = new BufferedWriter(osw); //4.写入数据 bw.write("此情可待成追忆,只是当时已惘然,xiaogou77"); bw.close();//关闭流 } }
运行结果:
注释:打开乱码证明成功了。因为指定的这个是UTF-16LE格式写入的文件。而我们打开默认用的就是UTF-8。
旁白:转换流就是在普通流转换成缓冲流的中间加上转换方法,这个转换方法的编码和要操作的文件编码一致。其他步骤都和缓冲流一样。