これは、データベース全体を完全に再シリアル化することによって行うのが最善であることに同意します。最新のコンピューターでは、線形書き込みでディスクあたり 30MB/秒をプッシュできます (十分なキャッシュがある場合はそれ以上)。また、30MB を超えるデータを処理している場合は、DB (HSQLDB、DerbyDB、BerkleyDB) が本当に必要です。これは単純な DB です。または、postgres/mysql にアクセスしてください。
ただし、既存のファイルの FIXED サイズのセクションを上書きする方法 (または、それをエミュレートする方法) は、次を使用することです。
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
try {
raf.seek(position);
raf.writeInt(newScore);
raf.close();
} finally { raf.close(); }
サイズを固定する必要があるため、raf.write(Integer.toHexString(newScore).getBytes()) の代わりに writeInt を使用することに注意してください。
テキストファイルが本質的にASCIIである場合(たとえば、人間がファイルを読み取るため)、値をバイナリにすることはできません.おそらく、HexStringを保持することもできます(サイズが固定されるため)、またはゼロにすることもできますパディングされた 10 進文字列:
しかし、絶対に絶対にできないことは、文字列を 1 バイト大きくすることです。そう:
bob 15
joe 7
nina 981
大量のスペースを埋めていない限り、ジョーのスコアを 10 に置き換えることはできません。
これがあなたのデータファイルである場合、ファイル全体を絶対に書き直す必要があります(変更点からのみ書き直すための追加のコードを書いたとしても、統計的にはファイルの50%になるため、価値がありません面倒。
もう1つ-書き直すと、ファイルが短くなるリスクがあります..そのためには、 raf.setLength(0); を呼び出す必要があります。最初のバイトを書き込む前に..そうしないと、新しいファイルの末尾にファントム テキストが表示されます。