1

現在、Android でいくつかのことを試しています。GSON を使用してデータを JSON に保存し、新しいデータを同じファイルに追加しようとしています。

コードが実行されるのはこれが初めてであり、データがtest.jsonというファイルに保存されているとしましょう:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
ArrayList<GSONObject> objects = new ArrayList<GSONObject>();

GSONObject obj = new GSONObject("sth", 1, 1345939200000);
objects.add(obj);

String json = gson.toJson(objects);

File file = new File(filePath + fileName);
FileWriter fileWriter = new FileWriter(file, true);

fileWriter.append(json);
fileWriter.close();

これでファイルに保存されました:

[ {
    "something": "sth",
    "id": 1,
    "time": 1345939200000
  } ]

後でアプリを再度実行したいのですが、同じファイルに新しいデータを追加して、次のようにします。

[ {
    "sth": "sth",
    "id": 1,
    "time": 1345939200000
  }, 
 {
    "sth": "sth2",
    "id": 2,
    "time": 1345939500000
  } ]

このプロセスで使用されるデータとメモリの量を節約しようとしているので、最初にファイルをメモリに解析してからファイルに書き戻すことは、むしろ避けたいことです。

助言がありますか?本当に GSON である必要はありません。うまく機能するものだけです。

編集: maaartinus からのいくつかの提案で問題を解決しました。ここで見ることができ、より良い解決策を知っている場合は貢献してください!

4

1 に答える 1

1

ファイルで表されている配列が必要なようです。それ以外の場合は、単純に追加して複数の独立したレコードを作成することをお勧めします。ここでは、 を使用しRandomAccessFile、閉じ括弧をコンマに置き換え、新しいレコードと閉じ括弧を追加することをお勧めします。

適切なエンコーディング1を使用すると仮定すると、ブラケットは 1 バイト (93) にマップされるため、ファイルの最後から始まる単純なループを介してそれを見つけるのはかなり簡単です。誰もファイルに書き込んでいない場合は、それが最後のバイトであると想定することもできます...

1そうですか。FileWriterいいえ、コンストラクターでエンコーディングを指定しなかったため、プラットフォームに依存するエンコーディングを使用します。プラットフォーム依存のエンコーディングを使用する私見は決して正気ではなく、対応するすべての方法を廃止する必要がありますが、それは私の意見です。


個々のオブジェクト (オブジェクトの配列ではなく) で十分な場合は、各オブジェクトの長さ (たとえば、 を使用DataOutputStream) の後にエントリを記述することをお勧めします。これにより、すばやく簡単にジャンプできるようになります。または、レコードの長さを含む別のインデックス ファイルを作成することをお勧めします (たとえば、バイナリ形式または行ごとに 1 つの数値文字列で)。

于 2012-08-27T16:12:27.683 に答える