java中的FileInputStream()是字节流,但为啥可以读取汉字,即在c:⼀⼀dest.txt中写入汉子也能被读出?妹求

2024年12月02日 16:08
有5个网友回答
网友(1):

用程序来解释更能说明问题

你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):

只是把文件内容按字节复制到另一个文件而已。没牵扯到编解码,为什么不可以?

另外其他几个说汉字2字节的,拜托,只是常用的中文Windows默认的GBK是这样。UTF-8可不是。

网友(3):

英文是单字节,汉字是双字节,在Fileinputstream里,它把文件读取并转换成byte数组。
之后就是Fileoutputstream的逆转换,把byte数组转换成字符。
在这一过程中,英文和汉子的区别仅仅在单双字节。你可以试一下,如果读取一半输出的话,汉字的转换如果正截取到某个汉字的一个字节,会出乱码。

网友(4):

其实,电脑中任何的数据,都是按字节保存的

网友(5):

拜托,一个汉字占2个字节好不,哥