日期:2014-05-20  浏览次数:20821 次

求大神解答java io中read方法读取char时的疑惑
String a = "GIF";
ByteArrayInputStream br = new ByteArrayInputStream(a.getBytes());
for(int i=0;i<6; i++){
System.out.println((char)br.read());
}
输出结果:
G
I
F
?
?
?
我想请问一下:
java中char占2个字节,"GIF"占6字节,br.read()方法应该一次读取一个字节,每次读取返回一个int值,用char强转后,得到一个字符,但是read方法不是只读取一个字节吗,为什么会把两字节的char的asc码读取出来,而且只读了三次就完成读取了,按理说应该是读取6次才对啊,求大神解答!!
------解决方案--------------------
你先看下a.getBytes() 是采用哪个编码集, 可以用: Charset.defaultCharset().name()得到;
若是GBK或GB2312,那你就得注意下:
GB2312/GBK 中的所有字符都是用二个字节表示,但有个条件:是在 全角方式下;
若是在半角方式 下,是采用ASCII编码的,也就是1个字节了;
------解决方案--------------------
你仔细看下API
read
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值
并不是说读一个字节!
------解决方案--------------------
默认utf-8编码,英文一个字节,中文三个字节,gbk英文一个字节,中文两个字节
上边说的英文是ascii码,文本读写用Reader和Writer