字节缓存流&字符流

2 篇文章 0 订阅
1 篇文章 0 订阅

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值