使用转换流实现文件的转码

  • Java IO提供的转换流
  1. InputStreamReader 将字节流转为字符流,读入到内存时为字符。
  2. OutputStreamWriter 将字符流转换成字节流,写出到硬盘或者网络时转为字节。

在使用这两个流时,可以很好的避免使用FileInputStream时将字符数据读入到字节中,然后将字节数据转换为字符串时出现的中文乱码情况。因为在GBK或者UTF-8编码表(字符集)中一个中文汉字占用的空间是至少两个字节。所以如果字节长度不够的话,很有可能只读取了某个中文字符的一半,这时在转换成字符串时就出现乱码了。
如下所示:

test.txt

我是中国人

@Test
public void test()throws Exception{

	FileInputStream fis = new FileInputStream("test.txt");
	byte[] bytes = new byte[3];
	int read;
	while((read = fis.read(bytes)) != -1){
		System.out.print(new String(bytes.0,read));
	}
	fis.close();
}

此时由于每次只读3个字节,假设使用GBK编码,一个汉字占用2个字节,第一次读取应该只能读取1个半汉字,此时在解码时就有错误了。可使用InputStreamReader来解决此问题。

  • 转换流改变文件编码

source.txt (GBK编码)

abc中国

将source.txt的内容改成UTF-8编码写入到sourcecopy.txt

@Test
public void test2() throws Exception{

	InputStreamReader isr = new InputStreamReader(
		new FileInputStream("source.txt"),"GBK");//这里的字符集要看source.txt这个文件当初保存时的字符集。
	OutputStreamWriter osw = new OutputStreamWriter(
		new FileOutputStream("sourcecopy.txt"),"UTF-8") ;//这里的编码是以字符为单位输出时的编码
	
	int read;
	char[] chars = new char[5];
	while((read = isr.read(chars)) != -1){
		osw.write(chars,0,read);
	}
	isr.close();
	osw.close();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值