从randomaccessfile读取数据

时间:2013-04-04 15:27:11

标签: java io randomaccessfile

这是我的功能:

// Read a record from the specified RandomAccessFile
   public void read( RandomAccessFile file ) throws IOException    {
      account = file.readInt();
      byte b1[] = new byte[ 15 ];
      file.readFully( b1 );
      firstName = new String( b1, 0 );
      firstName = firstName.trim();
      byte b2[] = new byte[ 15 ];
      file.readFully( b2 );
      lastName = new String( b2, 0 );
      lastName = lastName.trim();
      balance = file.readDouble();
   }

我必须能够从randomaccessfile中读取我的一个考试,上面的代码有点令人困惑。

这是我猜的正在发生的事情,如果你错了我就会很感激。

我们从文件中选择filereadInt并将其分配给account。接下来我想我们创建一个大小为15的新字节,并将文件中的第一个名称读入字节,然后分配给firstname。现在这里是我不明白的,readFully做了什么?以及上面的代码如何知道继续lastName的下一个值。 所以简单地说,

byte b1[] = new byte[ 15 ];
      file.readFully( b1 );
      firstName = new String( b1, 0 );
      firstName = firstName.trim();

VS

      byte b2[] = new byte[ 15 ];
      file.readFully( b2 );
      lastName = new String( b2, 0 );
      lastName = lastName.trim();
      balance = file.readDouble();

为什么它没有给出相同的价值?我们猜测每个值(名字,姓氏等)有多长?

2 个答案:

答案 0 :(得分:1)

正如api所说:

从当前文件指针开始,将此文件中的b.length个字节读入字节数组。此方法从文件中重复读取,直到读取所请求的字节数。

    public void write(RandomAccessFile file) throws IOException {
    file.writeInt(account);
    byte b1[] = new byte[15];
    // set firstname to b1
    file.write(b1);
    byte b2[] = new byte[15];
    // set lastname to b2
    file.write(b2);
    double balance =123.1;
    file.writeDouble(balance);
}

如果您生成的文件与上面完全相同,那么您可以阅读进度。

答案 1 :(得分:0)

如果这是学校/大学考试,请记住,他们故意知道荒谬,会让你感到困惑。

考虑您发布的代码中的评论:

  

从指定的RandomAccessFile

中读取记录

我敢打赌,你所定义的二进制文件的数据存储在这样的记录中:

  • 帐户 - 4B(int的大小)
  • 名字 - 15B
  • 姓氏 - 15B
  • balance - 8B

我还打赌假设数据写得正确 - 完全按照上面的顺序和长度。如果不是,例如有一个字符串而不是整数,或者第一个名称更大,它可能会导致错误或误解数据 - 这就是为什么你的代码片段给出不同的结果。

这是你正在阅读的binary file,如果你想阅读它,你必须现在它的确切格式。否则就像破译外星人的信件一样。

至于RandomAccessFile.readFullyMethod

  

从当前文件指针开始,将此文件中的b.length个字节读入字节数组。此方法从文件重复读取,直到读取所请求的字节数。此方法阻塞,直到读取请求的字节数,检测到流的末尾或抛出异常