InputStream is = new FileInputStream(file1);  
OutputStream os = new FileOutputStream(file2);  
int temp = 0;  
while ((temp=is.read()!=(-1)) {  
  os.write(temp);  
}  用这段代码将file1内容拷贝到file2中,每个汉字需要两次while循环,读写两次,每次一个字节,那么这个read()方法的返回值到底表示什么,api上说是下一个数据字节,但这里返回的显然是个int,那么这个介于0-255之间的int值表示什么呢?另外,Java采用Unicode编码,英文字母和汉字都是一个字符,为什么每个英文字母只要读取一次,而汉字需要读取两次?

解决方案 »

  1.   

    unicode的传输编码格式 ASCII字符使用一个字节表示,128到2047范围的字符使用双字节表示  中文使用三个字节表示
      

  2.   

    Java   内部处理字符使用的字序方式是   Unicode,这是一种通行全球的编码方式。Unicode   因为必须将中、韩、日、英、法、阿拉伯……等许多国家所使用的文字都纳入,目前已经包含了六万多个字符,所以   Unicode   使用了   16   个位来为字符编码。因为   Unicode   使用了   16   位编码,所以每个字符都用   16   位来储存或传输是很自然的事,这种储存或传输的格式称为   UTF-16(是不是很像战斗机的名字)。如果你使用到的字符都是西方字符,那么你一定不会想用   UTF-16   的格式,因为体积比   8   位的   Latin-1(一种扩充   ASCII   的编码)多了一倍。所以   Unicode   另有一种储存或传输的格式,叫做   UTF-8。UTF-8   的格式在编码英文时,只需要   8   位,但是中文则是   24   位,所以中文字出现比例高的地方还是使用   UTF-16   比较节省空间。Java   的   Class   File(也就是   bytecode)中有一字段叫做常数区(Constant   Pool),一律使用   UTF-8   为字符编码。 
    为了将成千上万的文字统一到同一个编码机制之下,在兼顾经济的原则下,不管是东方文字还是西方文字,在Unicode中一律用两个字节来表示。也就是说,Unicode是一种双字节编码机制的字符集,使用0-65535之间的双字节无符号整数对每个字符进行编码。这样,在Unicode字符集中,至少可以定义65536个不同的字符,足以应付目前绝大多数场合的需要。 
    UTF-8   是一种不等幅的编码方式,UTF-8编码的字节长度取决于所要编码的字符在ISO   10646中的编码值。在UTF-8中,不同的字符,可能需要1-6个字节来进行编码。对于单字节的UTF-8编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。对于多字节的UTF-8编码,如果编码包含n个字节,那么第一个字节的前n位为1,第一个字节的第n+1位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为 "10 ",其余6位用来对字符进行编码。 
    UTF-16也是Unicode的变形表示方式的一种。它的目的是维持双八位的编码方式,同时也用一些特殊的双八位来表示ISO   10646中非基本多文种平面(BMP)中的一些字符。这种用来表示非BMP字符的方法在Unicode中称作代理对机制。 
    代理对的编码机制以及原先不需要代理对的六万三千多个基本   Unicode   码,合起来叫做UTF-16。也就是说UTF-16   基本上就是   Unicode双字节编码的实现,再加上一个应付未来扩充需要的编码机制。 
      

  3.   

    read()返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
      

  4.   

    我只想知道,read()方法返回的整数表示什么,byte的范围是-128——127,这里返回的是0-255,英文字母读一次返回一个值,恰好是它的ascii码,汉字读两次返回两个值,我不知道这两个值代表什么。求解释……
      

  5.   

    不管什么文件格式,基本的存储单位都是字节。至于这些字节究竟代表的是文字,或者声音,或者视频,都和存储无关。只要逐个字节拷贝,就完成了文件的复制过程。byte的带符号取值范围 -128~127,无符号取值范围 0~255因为在java里,-1用来表示流的结束,为了不与带符号byte的值有冲突,在进行逐字节读取时,实际返回的是无符号数。