ファイルが小さく、置き換えようとしている入力値が「十分に」一意であり、迅速かつ汚いことを受け入れる場合は、apache commons-exec またはシェルアウトする何かを使用します。
bash$> echo '{
"id" : "20120421141411",
"name" : "Example",
"time_start" : "2012-04-21T14:14:14"
}' | sed -e 's/Example/othername/'
出力:
{
"id" : "20120421141411",
"name" : "othername",
"time_start" : "2012-04-21T14:14:14"
}
cat file | sed ...
ファイルへのパスがわかっている場合に使用します。
ファイルをその場で編集して、変更したいバイトにのみ書き込みたい場合は、書き込み中のデータがファイル内の後続のデータを上書きしない場合にのみ可能です。上記の解決策のいずれかを使用する方がはるかに優れています。
JSON ファイルが巨大 (>1GB?) であると仮定すると、この手法は理にかなっているでしょうか? いいえ、そんなに大きな JSON ファイルで一体何をしているのですか? 分けて!しかし、議論のために...
本当にやりたいので、JSON パーサーにフックして、ファイル内のバイト オフセットを追跡し、それを、操作する JsonNode を表すオブジェクトに関連付けることができます。この時点で、独自のパーサーを作成することになるかもしれません。JSON 文法は意図的に単純化されています。次に、ファイルを開き、そのオフセットにスキップして、JsonNode データを書き込みます...その後何かを上書きしない限り (念のため、すべての値の後にスペースのバッファーをファイルに事前に入力しますか?うーん? ...これはデータベースの問題のように聞こえ始めています)。その場合、大きな値が他のすべてを「押し下げる」ため、残りのファイル全体を書き直すことになります。編集が常にファイルの終わり近くにある場合は、大したことではありません。しかし、それらがランダムである場合、あなたのパフォーマンスは運命づけられています. 書き込みのシリアル化がボトルネックになります。