java IO 中我有个现象无法解释

来源:百度知道 编辑:UC知道 时间:2024/06/17 00:29:53
java.io.inputstream 这个类有个方法是read(),手册上说是一次读取一个byte,并返回十进制的数字。这本来没问题,但请看下面的例子:
import java.io.*;

public class streamdemo{
public static void main(String[] args){
try{
System.out.print("input a letter:");
System.out.println("what you input is:"+ System.in.read());
}
catch(IOException e){e.printStackTrace();}
}
}

我输入一个字符A,屏幕中就可以显示出A对应的数字65. 我就不明白了,输入的A是一个字符,而java中字符是占两个字节的,为何read()一次就可以把A的两个字节的内容给读入了?
难道从键盘上输入的A不是个字符?还是什么地方我理解错了?
望高人指教。

中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。

API文档上是这么说的:
Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255
所以它不是读内容,只是读进来一个字符。如果是读一个基本字符的话,会返回这个字符的ASCII码值,A的ASCII值是65.
至于什么时候会返回128到255之间的数,我还没试过。。

说简单点,A是一个字符,而java中所有字符都是用Unicode编码存储的,一个Unicode编码占用2个字节。A的Unicode编码是65,自然就转换过来了。