用程序来解释更能说明问题
你source.txt里把内容改一下,内容为:a你好b
然后执行下面的程序看
public class Test {
public static void main(String[] args) throws Exception {
int b = 0;
FileInputStream in;
FileOutputStream out;
// 数据源,用于向程序中读取信息
in = new FileInputStream("c:/source.txt");
// 目标文件,程序将信息写到此文件中,会自动创建文件
out = new FileOutputStream("c:/dest.txt");
int count = 0;
while ((b = in.read()) != -1) {// 一次读一个字节,判断是否读到文件结尾
out.write(b);// 一次写一个字节
if (count++ >= 2) {
/*
* 假设:你source.txt内容是:a你好b
* 此处为人为不读取完,就退出,
* 就会出现某个中文字符是由2个字节组成而有乱码
* (此处暂且算中文字符是2个字节,暂且以GB2312编码为例)
* (utf8的中文有可能是2个,大部分中文占3个,少部分占4个字节)
*
* 这里程序人为的读取source.txt到第3个字节的时候就中断,
* 这时只读取了两个字节:a你(你是2个字节组成
* 而你只读两个字节就中断,那么你字只读取了1个字节,就出现乱码)
* 此时,如果你把count++ >= 1改为count++ >= 2;
* 就会读3个字节出来:a你 此时就可以读出来了,就是正确的字符
*
* 你原来的程序就是把source.txt全部读取出来了
* 又写出到dest.txt所以你这时感觉不到如果有中文
* 此中文如不读取完整的2个字节就有乱码的情况
* 因为你是完整的读出又写出了,没有中断过
*/
break;
}
}
in.close();
out.close();
System.out.println("文件已复制");
}
}
只是把文件内容按字节复制到另一个文件而已。没牵扯到编解码,为什么不可以?
另外其他几个说汉字2字节的,拜托,只是常用的中文Windows默认的GBK是这样。UTF-8可不是。
英文是单字节,汉字是双字节,在Fileinputstream里,它把文件读取并转换成byte数组。
之后就是Fileoutputstream的逆转换,把byte数组转换成字符。
在这一过程中,英文和汉子的区别仅仅在单双字节。你可以试一下,如果读取一半输出的话,汉字的转换如果正截取到某个汉字的一个字节,会出乱码。
其实,电脑中任何的数据,都是按字节保存的
拜托,一个汉字占2个字节好不,哥