1. 转换流
字符编码
在计算机中所有的字符都有与之对应的编码,然而各个国家都有自己的文字,所以就有不同的编码表。下面列举一下常用的编码表
1.ASCII编码表:美国信息交换表
包含字母、数字、标点符号
2.GBK:中国的码表
完全兼容ASCII编码表、还包含汉字
字母:1个字节
中文:两个字节
3.UTF-8: 万国表
兼容ASCII编码表,同时包含各个国家的文字
字母:1个字节
中文:3个字节
注意:用什么格式的编码表进行编码,就用什么格式编码表解码:
编码:字符-->数字
解码:数字-->字符
代码如下:
//编码
String str="中国";
//使用默认“UTF-8”进行编码,两个汉字占用6个字节
byte[] bs1=str.getBytes();
//使用指定“GBK”进行编码,两个汉字占用4个字节
byte[] bs2=str.getBytes("GBK");
//解码
//把bs1中的字节,按照默认的“UTF-8”进行解码成字符串
String st1=new String(bs1);
//把bs2中的字节,按照指定的”GBK“进行解码成字符串
String st2=new String(bs2,"GBK");
1.2转换流读取数据
由于直接使用字节流读取或者写入中文,由于不同的编码表对中文的支持不一样,可能会造成乱码问题
转换流就可以按照指定的编码表来读/写文件中的文字
转换流读取字符的原理: 内部也是依赖于字节流来读取字节,只不过会把读取到的字节查询编码表,翻译成字符
InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\a.txt"),"GBK");
//一次读取多个字符
char[] chs=new char[1024];
int len;
while ((len=isr.read(chs))!=-1){
//把字符数组转换为字符串
String str=new String(chs,0,len);
System.out.println(str);//如果有汉字会出现乱码
}
//释放资源
isr.close();
1.3转换流写数据
使用OutputStreamWriter转换流可以使用指定的编码表,往文件中写数据
//使用OuputStreamWriter对FileOutputStream进行包装,再加上编码表
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\b.txt"),"UTF-8");
osw.write("中国\r");
osw.write("富强");
osw.write("民主");
osw.write("和谐");
//释放资源
osw.close();
1.4转换流复制文件
/*
需求:把a.txt(GBK)文件的内容复制到b.txt(UTF-8)文件中
使用转换流可以按照指定的编码进行读和写
源文件:a.txt(GBK)
使用GBK的编码进行读取
目标文件:b.txt(UTF-8)
使用UTF-8的编码进行写入
*/
//源文件:a.txt(GBK),使用GBK的编码进行读取
InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\a.txt"),"GBK");
//目标文件:b.txt(UTF-8), 使用UTF-8的编码进行写入
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\b.txt"),"UTF-8");
//一边读一边写
char[] chs=new char[1024];
//定义变量,记录每次读取的有效字符个数
int len;
while ((len=isr.read(chs))!=-1){
//把读取到的字符数据,写入文件中
osw.write(chs,0,len);
}
//释放资源
osw.close();
isr.close();
2.字符流
转换流在读写文本文件的时候,需要指定编码表和字节流,也比较麻烦,Java语言给我们提供了两个字符流,专门用于读取或者写入文本文件。
FileReader:读取文本文件(必须是UTF-8编码文件)
FileWrite:写入文本文件(必须是UTF-8编码文件)
//创建输入流对象读取a.txt文件
FileReader fr=new FileReader("day09-code/a.txt");
//创建输出流写入c.txt文件
FileWriter fw=new FileWriter("day09-code/c.txt");
//读写数据
char[] chs=new char[1024];
int len;
while ((len=fr.read(chs))!=-1){
//把读取到的数据转换为字符串
fw.write(chs,0,len);
}
fr.close();
fw.close();