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

  • 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();

}

猜你喜欢

转载自blog.csdn.net/qq_43750656/article/details/121373245