import java.io.*;public class ReadRandom
{
  public static String readLine() throws IOException
  {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    return br.readLine();
  }  public static int getRecordNumber() throws IOException, NumberFormatException
  {
    System.out.println("Record number (-1 to quit)?");
    return Integer.parseInt(readLine());
  }  public static void main(String[] args)
  {
    int dataSize;  // Number of elements in File
    int rn;  // Record number
    double value;  // Value of requested record
    int sizeOfInt = 4;  //  size of int variable
    int sizeOfDouble = 8;  // size of double variable
    boolean wantsToQuit = false;
    try
    {
      File fi = new File("Data.bin");
      RandomAccessFile rin = new RandomAccessFile(fi, "r");      dataSize = rin.readInt();      System.out.println("\nFile has " + dataSize + " elements\n");      while (!wantsToQuit)
      {
        rn = getRecordNumber();        wantsToQuit = (rn == -1);        if (!wantsToQuit)
        {
          rin.seek(sizeOfInt + rn * sizeOfDouble);  // MARK!!!!!!!!!!!!!          value = rin.readDouble();          System.out.println("record" + rn + " = " + value);
        }
      }
    }
    catch (IOException e)
    {
      System.err.println(e);
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
  }
}请问各位高手这个seek(sizeOfInt + (rn * sizeOfDouble))中的为什么这么计算文件的中的指针定位,还有这里的参数计算结果怎么是整型的,doc文档的好象是long型的,这也是为什么,小弟可能问的太幼稚了,希望各位大虾见谅!!!

解决方案 »

  1.   

    为什么这样计算,文件中存放的数据结构有关。因为这些变量的类型就是 int 型的啊,int 与 int 运算,产生的结果当然还是 int 啰。可以把 rn 设为 long,其他的不动,这样会自动转为 long 的。doc 文档为什么是 long 型,这个问题我也想过很久,如使用 int 型的话,那文件的大小最大只能有 2GB 了,由于有些文件系统可以支持超过 2GB 的文件,所以不能使用 int,但是使用 long 型的话,好像有点大得吓人了,不过没办法比 int 大的,只有 long 了。
      

  2.   

    既然要求是long型的参数,那么为什么整型的参数在里面也能运行成功呢?是不是整型的范围比long 的范围小,所以不会出错,要是里面的参数的结果是Double就不行了吧
      

  3.   

    因为 int 的范围比 long 小,会自动向上转型的,不能向下转型。double 比 long 大两级不能向下转型。自动转型方向可以参见下图:                   +-- char
                       |
    double <-- float <-- long <-- int <--+-- short <-- byte