import java.io.*;public class TestEOF {
  public static void main(String[] args) 
  throws IOException {
    DataInputStream in = 
      new DataInputStream(
       new BufferedInputStream(
        new FileInputStream("TestEof.java")));
    while(in.available() != 0)
      System.out.print((char)in.readByte());
  }

    看程序的最后一行:System.out.print((char)in.readByte());
    假如in中有两个byte代表一个char:"a" 按照上面程序开始只能到读第一个byte.然后就把这个byte转换为char. 得到的字符应该不能正确表达字符"a".但是这样运行的时候输出正常. 
    而如果把readByte()改为readChar().这样似乎合理. 因为它每次读两个byte,正好代表一个char.但是这样运行的时候输出的却是乱码.
    请指教!!!!!

解决方案 »

  1.   

    .java文件就是以byte为单位存储的吧
      

  2.   

    因为你的源文件并不是unicode编码的,一个char就是一个字节,而readChar方法读取的是unicode编码的char,是两个字符的,readChar把两个不应该合并在一起的字节读出来并进行了(char)((a << 8) | (b & 0xff))的移位处理,这样出来的东西自然是乱码了。只有通过writeChar方法写到OutputStream的流才能被readChar正确的读出来。而readByte则不对源文件进行任何附加的处理,读到什么就输出什么,所以内容是正确的。