1

ランダムアクセスファイルを使用してバイナリツリーを更新しようとしています。ただし、ノードを追加するたびにツリー全体を書き換えるのではなく、変更したばかりのノードのみを更新したいと思います。これまでに2つの質問があります。

RandomAccessFileを使用してファイルにオブジェクトを書き込む際に問題が発生しました。これはノードオブジェクトであるため、RAFには読み取り/書き込みメソッドはありません。ツリークラスにSerializableを実装しましたが、ツリーをファイルに書き出す方法がわかりません。

Node<String> mynode = new Node<String>();
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
raf.write(mynode, 0, 100);

mynodeではないため、エラーが発生しますbyte[]

私の2番目の問題は、上書きするファイルを探す方法がわからないことです。私がしたことは、idのノードにフィールドを追加し、変更する場所を見つけるためにid:positionのハッシュマップを保持することです。これが正しい方法かどうかわからない

4

1 に答える 1

1

あなたのアプローチがあなたが思うようにうまくいくとは思わない。RandomAccessFileは、任意の位置でバイトを読み書きするために使用されます。オブジェクトを取得してバイト配列にシリアル化し、それをRAFに書き込む(またはfileoutputstreamを使用してシリアル化されたバイトを書き込む)ことはできますが、シリアル化された形式であるため、レコードを更新する場合には役立ちません。レコードの長さは、変更するたびに異なる可能性があります。

コメントの1つで述べたように、探しているのはデータベースです。これは、RandomAccessFileがアクセスできる単純な線形バイトチェーンよりも高レベルの抽象化です。

レコードの読み取りと書き込みが可能なファイルベースのストレージシステム(つまり、軽量の組み込みデータベース)をお探しの場合は、jdbm2を確認してください。bツリー構造も組み込まれています(ファイルベースのストアに最適です)。二分木よりも)。

于 2012-03-10T04:59:30.413 に答える