编码问题(Java的IO流为什么会有字节流和字符流)

Java的IO流为什么会有字节流和字符流

首先明确字节流适用于任何场景,而且有字节缓冲流,能提高读取和输入的效率,也就是BufferedOutputStream/BufferedInputStream。其操作与字节流基本都一样。
而字符流是为了应对汉字出现的情况。在GBK中汉字占2个字节,在UTF-8中汉字占3个字节,所以我们通过字节流读取文件的时候一般都是逐个字节转换就会导致乱码,而手动去根据不同编码去拼接则不方便,所以有字符流。

这边再解释一下为什么使用字节流复制粘贴中文文件时不会乱码的原因:
不论是使用GBK还是UTF-8编码,中文的第一个字节都是负数,逐个字节读取后文件会根据不同的编码自动进行拼接。而当我们手动向文件输入数据时,使用 write(“中国”.getBytes()),其实getBytes默认是UTF-8编码,如果文件也是UTF-8编码那自然也不会乱码。 (getBytes(“指定编码类型”))

在Java中将字节数组转换为字符串使用String(字节数组),默认的编码也是UTF-8,当然也可以自己指定编码,String(字节数组,“指定编码类型”)。

使用字符流时,OutputStreamWriter/InputStreamReader都可以在第二个参数处添加编码方式,默认还是UTF-8,这样在操作中文文件时就避免了在控制台输出时乱码或者需要手动拼接的麻烦。