1、对于字节流来说,从输入流里读取的字节编码取决于被读取的文件自身的编码,输出流生成的文件编码取决于字节编码。

2、对于字符流来说,其底层仍为字节流操作,所以输入流读取文件可以看做是把文件读取成字节,然后字节再转换为字符,这就涉及到两个过程,第一个过程与字节流读取一样,但是第二个过程new InputStreamReader(inputStream)即字节转字符时InputStreamReader()默认是utf-8编码,如果字节的编码不是utf-8,那么转换过程就会出错,所以这里转换编码要和文件编码一致,可以在转换时指定转换的编码new InputStreamReader(inputStream,"gbk");同样,输出流与此相反,生成文件的编码取决于new OutputStreamReader()时的编码,作为中间载体的字符是统一的char,所以只要保证转换时的编码与文件编码一致即可保证无乱码,无需输入流与输出流编码一致。

注:个人见解,仅供参考。我没有研究过其源码,只是在代码中测试了一下。