我用了下面的程序往一个文件里写了数据,最后显示的是一对乱码,据了解是经过Unicode编码后得出的
import java.io.*;public class TestFileWriter{
  public static void main(String[] args){
    
    try{
      FileWriter w= new FileWriter("d:/TestWriter.txt");
      for(int c=0; c<=65535; c++){  
        w.write(c);
        System.out.print(c+" ");
      }
    }catch(IOException e){
      e.printStackTrace();
      System.out.println("文件写入出错");
      System.exit(-1);
    }
  }然后我用下面的程序把这个文件里面的内容读出来
import java.io.*;public class TestBufferStream{
  public static void main(String[] args){
    try{
      FileInputStream fin=new FileInputStream("d:/java exercise/TestWriter.txt");
      BufferedInputStream bin=new BufferedInputStream(fin);
      int c;
      System.out.println(bin.read());
      System.out.println(bin.read());
      bin.(320);
      for(int i=0;i<10&&(c=bin.read())!=-1;i++){
        System.out.print(c+" ");
      }
        System.out.println();
        bin.reset();
        for(int i=0;i<10&&(c=bin.read())!=-1;i++){
          System.out.print(c+" ");
        }
        bin.close();
    }catch(IOException e){e.printStackTrace();}
  }
}int类型是32位,4个字节的,read()是读出一个字节,为什么最后显示的还是原来那个整数呢,不是应该只读出原来的整数的四分之一的字节么??

解决方案 »

  1.   

    FileWriter 的write(int )方法的参数虽然是一个int,但真下write的是一个字符,就是把这个int的高16位截掉,把剩下的低16位做为一个字符输出,就是说做了一次强制类型转换,write这个字符时又要遵守一个叫“高效单字符输出的”的原则,也就是说,如果这个字符的高8位是0则只write低8位(实际就是ASCII),如果这个字符是unicode中没有定义的字符,则write一个'?'字符。如果你把TestBufferStream中的for语句中的i<10改的大一点,比如i<10000;再对照一下out.txt就能明白了。