InputStream和OutputStream都是字节流也就是每次读取或者写入一个字节
看如下程序
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
InputStream read=new FileInputStream("C:\\a.txt");
OutputStream writer=new FileOutputStream("C:\\b.txt");
int a;
while((a=read.read())!=-1)
{ Integer.toHexString(a);
System.out.print((char)a);
writer.write(a);
}
}
a.txt中的内容如下
dad问字大点dasd
dasdkda好的
控制台打印如下:
b.txt中的内容和a.txt中的内容相同
为什么控制台和b.txt中的内容不同呢
原因是TXT的默认编码是ANSI即字母占一个字节,中文占两个字节 如下图
当我们read的时候也就是程序a变量每次获得十六进制编码如下图
可以看出原来的编码和现在的编码相同都是ANSI 但是当我们把a打印print的时候会发现字母正确,中文乱码
根据API文档我们可以发现
public void print(char c)
打印字符。按照平台的默认字符编码将字符转换为一个或多个字节,并完全以 write(int) 方法的方式写入这些字节。
参数:
c - 要打印的 char
这里的默认编码中文环境下为GBK即使用GBK编码 再交给控制台输出但是这里交给他的参数是一个字节 所以出错乱码
而写入b.txt时是将a.txt编码原封不动的写入的所以不会造成错误