关于RandomAccessFile里面的 readChar()方法的疑问:请看如下代码:import java.io.*;//测试RandomAccessFile()方法
class Test_AccessFile{
      public static void main(String[] args) throws IOException,FileNotFoundException{
       File file1=new File("C:/Classes/stream/FileDemo.java");
       try{
               RandomAccessFile rafile=new RandomAccessFile(file1,"rw");
               rafile.seek(1);
               int i=0,j=0;
               System.out.println(rafile.getFilePointer());
               while(rafile.read()!=-1);
               System.out.println(i);
               System.out.println(rafile.getFilePointer());
               rafile.seek(0);
               System.out.println(rafile.getFilePointer());             ______________________________________________________________________________
代码段 0       byte[] b=new byte[(int)rafile.length()];
while(rafile.read(b)!=-1);
               System.out.println(rafile.getFilePointer());
               for(j=0;j<b.length;j++){
                System.out.print((char)b[j]);
               
               }
_______________________________________________________________________________
代码段1       rafile.seek(0);
               while(rafile.read()!=-1){
                System.out.print((char)rafile.readByte());
               }
_______________________________________________________________________________
代码段 2               rafile.seek(0);
               while(rafile.read()!=-1){
                System.out.print(rafile.readChar());
               }
_______________________________________________________________________________      代码段 3     System.out.println("abcdefg");
               System.out.println("");
               System.out.println("");
               System.out.println("");
               rafile.seek(5);
               System.out.println(rafile.readChar());
               
       }
       catch(FileNotFoundException e){
       System.out.println("File not found");
       System.out.println(e);
           
       }
       catch(IOException e){
       System.out.println("Filepointer is null.");
       System.out.println(e);
       }
      }}  代码段1的本意是用readByte()逐个字节输出,然后转换为char,输出到屏幕;
代码段2的本意是用readChar()逐个字符输出到屏幕。问题是:当代码段1存在时,输出是casFlDm{*
 pbi ttcvi anSrn rs]{
        iefl1nwFl(C\Cass\tem\ieitreojv";….
…..
…..
一堆乱码。
然后代码段2,代码段3根本没有执行。当屏蔽掉代码段1,代码段2、3都能执行,担输出是:
浰牴橡愮漮??污猠楬?潻??扬挠瑡楣癯搠慩?物朠牧孝笍??汥晩攱湥?汥?屜污獥屜瑲慭屆汥
楬敲敭?癡???祳敭潵?楮汮?牥琠猠?汥?瑐牥琨???楬?牥瑟楬?汥?瑐牥瑆汥???祳敭潵?楮汮


等中文乱码?是什么回事呢?还有另外一个问题,请看代码段 0,我的本意是用byte[]建立一个长度等于文件大小段数组,然后通过read()方法逐个字节的把文件内容输入到数组 b[],然后逐个转换为char输出到屏幕,运行输出一切正常,但后来我自己想了一下,觉得有点不妥。Char在内存是16位的,就是每个文件的字符都占16位,但byte是8位的,也就是说我把文件的每个字节输入到b[]数组后,相当于每两个b[]数组才能组成一个正确的文件的字符,但我把逐个char字符用类型转换强制转换成char,然后逐个输出,这样每个char只拥有原来每个char的一半数据,高8位的数据应该补0而丢失,而char的个数应该是文件字符个数的两倍,我是这样想的,但为什么结果却非常正常的输出呢?

解决方案 »

  1.   

    char是unicode的,估计问题就在这里,看你读的文件使用什么保存的
      

  2.   

    代码段1       rafile.seek(0);
                   while(rafile.read()!=-1){
                    System.out.print((char)rafile.readByte());
                   }
    _______________________________________________________________________________
    代码段 2               rafile.seek(0);
                   while(rafile.read()!=-1){
                    System.out.print(rafile.readChar());
                   }
    建议改为:
                try
                {
                  rafile.seek(0);
                  while(true)
                  {
                    System.out.print((char)rafile.readByte());
                  }
                }
                catch(EOFException e)
                {
                  System.out.println("file end");
                }            try
                {
                  rafile.seek(0);
                  while(true)
                  {
                    System.out.print(rafile.readChar());
                  }
                }
                catch(EOFException e)
                {
                  System.out.println("end file");
                }
    你连续使用了两个read方法,是不恰当的
    代码段 2 你使用readChar()读取,文件里本来都是英文字符,是8位的,你使用readChar()一次读入一个字节,所以两个英文字符一起读入,当一个字节的字符输出,所以就出现乱码现象。
    至于你说为什么正常输出,我不大了解你的意思,是应该正常输出啊,没有什么不对么