- Java IO提供的转换流
- InputStreamReader 将字节流转为字符流,读入到内存时为字符。
- 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();
}