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

char的存储问题
有个这样的程序:
Java code

import java.io.*;
public class TestFileInputStream {
  public static void main(String[] args) throws IOException,FileNotFoundException {
    FileInputStream in = null;
    in = new FileInputStream("C:\\a.txt");
    int b,sum=0;
    while((b=in.read())!=-1){
        System.out.println((char)b);
        sum++;
    }
    System.out.print(sum);
  }
}


a.txt中存放的是 abc
程序运行之后输出的是abc 和3
我有点疑问,既然java中char是采用16位,in.read()每次读取一个字节,那么应该是先取出文本中char(a)的高8位,然后是低8位,再是b的高8位,然后是b的低8位啊。高8位是0,那么读到byte型的b中也是0,sum怎么能是3呢,我感觉应该是6呢?

------解决方案--------------------
abc在文件中实际存储时,各只占一个 byte 即可。

你也可以试试看:
System.out.println((byte)b);
输出的就是 a b c 的ASCII码。
------解决方案--------------------
LZ把程序的类型长度和文件的字符长度搞混了
程序的类型长度由编译器决定,java编译器规定用2个byte的空间保存1个char,也就是每个char类型的变量,在程序运行时占用内存空间是2个byte(注意是变量本身占用的内存空间)
文件类型的字符长度由编码决定,是字符占用硬盘空间的大小,ascii码文件(也就是所谓的ISO-8859-1编码文件),对于拉丁字符占用1个byte,多字节字符采占用多个byte,LZ是试试看把a.txt文件保存为unicode编码再跑跑程序就知道了(用notepad打开a.txt文件,用另存为的方式保存,并选择编码为unicode等非asicc编码,可以看到文件的占用硬盘空间也变了)。