0

私は1つの実装の問題を理解するのに苦労しています.1つのクラスがあり、リストのように動作しますが、コレクションにファイルを保持する代わりに、それらをディスクに保存します。

リストに要素を追加したいときに問題が発生します。ファイルの先頭に、リストにあるオブジェクトの数を示す 1 つの int がありますが、この値を更新するエレガントな方法がわかりません。私はこのようなものを持っています:

   public boolean add(T element)
{
    try 
    {
        out.writeObject(element);
        out.flush();
        //and here we need to update the int in my file
    } catch (IOException e) 
    {
        e.printStackTrace();
    } 
    return true;
}

私はこのようなものを使用しようとしました:

ObjectOutputStream upd=new ObjectOutputStream(new FileOutputStream(data.getAbsolutePath(),true));

しかし、私が観察したように、ファイルの先頭、シリアル化ヘッダーまたは sth にいくつかのデータが書き込まれます。ファイル内の単一のエントリを更新するにはどうすればよいですか、または変更する方法

ObjectOutputStream

ファイルの先頭に書き込む「ポインタ」?

4

1 に答える 1

2

通常、ストリーム ベースのクラス (特に OOS のような高次ストリーム) では、ファイルを更新するたびにファイル全体を書き直す必要があります。

ファイルの一部のみを更新することを本当に主張する場合は、ファイルを N 個のストリームで構成されていると考える必要があります。各「ストリーム」は、作成中の 1 つのオブジェクトを表します。したがって、ベースファイルに RandomAccessFile を使用し、オブジェクトを書きたいときは、ObjectOutputStream を ByteArrayOutputStream の上にラップし、オブジェクトをそれに書き込み、それらのバイトを取り、それらのバイトを RandomAcessFile に書き換えます。あなたがしたい。

N 個の OOS ヘッダーと、記述しているオブジェクトの N 個のクラス記述を記述するため、これはおそらく特に効率的ではありません。

于 2011-12-03T17:23:21.770 に答える