1

ゲームのハイスコアの実装を作成しています。ここに私がやりたいことがあります: String Name と Integer スコアを含むオブジェクト Score があります。今 :

  • 名前がまだファイルにない場合は、追加します
  • 名前がファイルにある場合、スペースの後に文字列を取得して整数に変換すると、スコアが得られます。

さて、スコアが実際よりも優れている場合は、ファイルに上書きする必要があります...そしてここに私の問題があります..私はそれを行うことができますか? ファイルの特定のポイントで文字列を別の文字列に正確に書き込むにはどうすればよいですか?

4

5 に答える 5

4

一般に、この種の要件のためにテキスト ファイル内のテキストを置き換えるのは面倒すぎると考えられているため、ファイル全体を読み込んで置換を行い、ファイル全体の新しいバージョンを作成するのが通常の方法です。大量のデータがある場合は、代わりにデータベースまたは NoSQL ソリューションを使用します。

PS シリアライゼーションの使用を検討してください。これにより、作業が簡単になります。

于 2012-06-29T10:34:44.260 に答える
1

String Name と Integer スコアを含むオブジェクト Score があります。

Properties代わりにファイルを使用してください。ファイルの読み込みと保存、キーの取得 (名前)、値の設定または取得 (スコア) を行うための簡単なインターフェイスを提供します。 String値は格納されますが、整数との間で簡単に変換できます。

于 2012-06-29T10:39:49.720 に答える
1

これは、データベース全体を完全に再シリアル化することによって行うのが最善であることに同意します。最新のコンピューターでは、線形書き込みでディスクあたり 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); を呼び出す必要があります。最初のバイトを書き込む前に..そうしないと、新しいファイルの末尾にファントム テキストが表示されます。

于 2012-06-29T10:46:41.823 に答える
-1

名前とスコアをファイルに保存する特定の理由はありますか?

Map<String, Integer>のほうがはるかに役立つようです...

于 2012-06-29T10:34:31.543 に答える