43转换流
Posted zhuifeng-mayi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了43转换流相关的知识,希望对你有一定的参考价值。
字符编码简介
计算机中存储的数据都是二进制的数字,我们看到的文字信息是将二进制转换之后显示的,两者之间存在编码与解码的过程,其互相转换必须遵循某种规则,即编码和解码都遵循同一种规则才能将文字信息正常显示,如果编码跟解码使用了不同的规则,就会出现乱码的情况。之前接触过的ASCII编码,这个主要是用来显示英文,除此之外还有别的编码规则常用的有:
gb2312,gbk,utf-8,big5
使用字符流读取不同编码的文本
这里先创建两个文本文档,一个使用utf-8进行编码,文件名命名为utf-8.txt,里面随便写点中文,比如我写了一个"小猴子",另一个使用gbk进行编码,文件名命名为gbk.txt。
需求:将utf-8.txt中的内容读取并写出到gbk.txt中
package decode_ecode; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class test_1 { public static void main(String[] args) { BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new FileReader("utf-8.txt")); bw = new BufferedWriter(new FileWriter("gbk.txt")); String msg = "我爱吃大蒜"; while((msg = br.readLine()) != null) { bw.write(msg); } bw.flush(); }catch(FileNotFoundException e) { e.printStackTrace(); }catch(IOException e) { e.printStackTrace(); } } }
上面程序出现了乱码问题,因为gbk.txt和utf-8.txt中使用的编码不一致。
转换流
如果要解决上面问题,需要使用InputStreamReader和OutputStreamWriter指明文本文件的编码,这两个类都属于字符流,可以将字节流输出为字符流。
package decode_ecode; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class test_2 { public static void main(String[] args) { BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8")); bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk")); String msg = "我爱吃大蒜"; while((msg = br.readLine()) != null) { bw.write(msg); } bw.flush(); }catch(FileNotFoundException e) { e.printStackTrace(); }catch(IOException e) { e.printStackTrace(); } } }
上面的代码中再FileInputStream对象上使用了InputStreamReader装饰,从而将字节转换为字符,之后再InputStreamReader对象上又使用了BufferedReader将字符进行缓冲,从而提高效率。
以上是关于43转换流的主要内容,如果未能解决你的问题,请参考以下文章
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段