0

これが私が持っている機能です:

// 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();
   }

私の試験の 1 つで randomaccessfile から読み取ることができる必要があり、上記のコードは少しわかりにくいです。

これが私が推測していることです。間違っている場合は修正していただければ幸いです。

ファイルを取り込んfileで にreadInt割り当てます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();

なぜ同じ値を与えないのですか?各値 (名、姓など) の長さを推測していますか?

4

2 に答える 2

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);
}

上記とまったく同じようにファイルを生成すると、進行状況を読むことができます。

于 2013-04-04T15:29:40.290 に答える
0

これが学校/大学の試験である場合、彼らはあなたを混乱させるために意図的にばかげていることを知っていることに注意してください.

あなたが投稿したコードからのコメントを考慮してください:

指定された RandomAccessFile からレコードを読み取ります

あなたが読んでいるバイナリファイルには、次のようなレコードにデータが格納されていることが定義されているに違いありません。

  • アカウント - 4B (int のサイズ)
  • 名 - 15B
  • 姓 - 15B
  • バランス - 8B

また、データが正しく書き込まれていること、つまり上記の順序と長さで正確に書かれていることも想定されていると思います。そうでない場合、たとえば、整数の代わりに文字列が使用されている場合や、ファースト ネームが大きい場合、エラーやデータの解釈の誤りが発生する可能性があります。これが、スニペットの結果が異なる理由です。

とにかく、それはあなたが読んでいるバイナリファイルです.何かを読みたい場合は、それが書かれた正確なフォーマットが必要です. そうでなければ、エイリアンの文字を解読するようなものです。

RandomAccessFile.readFullyMethodに関しては:

現在のファイル ポインターから開始して、このファイルからバイト配列に b.length バイトを読み取ります。このメソッドは、要求されたバイト数が読み取られるまで、ファイルから繰り返し読み取られます。このメソッドは、要求されたバイト数が読み取られるか、ストリームの終わりが検出されるか、例外がスローされるまでブロックされます。

于 2013-04-04T15:45:11.200 に答える