ファイルが小さく、置き換えようとしている入力値が一意の「十分」で、クイックダーティになっている場合は、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ファイルを使って何をしているのですか?分割してください!しかし、引数のために...
あなたは本当にそれをやりたがっているので、ファイル内のバイトオフセットを追跡し、それをJsonNodeを表すオブジェクトに結びつけるためにJSONパーサにフックします操作されます。この時点であなた自身のパーサを書くことになるかもしれません。 JSON文法は意図的に簡単です。その後、ファイルを開いて、そのオフセットにスキップし、JsonNodeデータを書き込んでいます...それが後に何かを上書きしない限り(ちょうどすべての値の後にスペースのバッファをあらかじめファイルに入れていますか? ...これはデータベースの問題のように聞こえ始めています)。その場合、ファイルの残りの部分全体を書き直すことになります。大きな値は、他のすべてを下に「プッシュ」するからです。編集が常にファイルの終わり近くにある場合、大したことではありません。しかし、それらがランダムであれば、あなたのパフォーマンスは破滅します。書き込みの直列化のボトルネックになります。
ありがとうございました –
私は混乱しています。それはジェネレータにコピーされますか?イベントとは何ですか?私も同様の問題があり、jsonの文字列を変更する必要がありますが、私はあなたの答えからこれを理解することはできません。 – simgineer
これは、JSONを一連のイベント( 'JsonToken')として読み込むために' JsonParser'が使用されるJackson Streaming API用です。同様のイベントとしてJSONコンテンツを書き込むための 'JsonGenerator'もあります。パーサをジェネレータに接続して、ほとんどの場合イベントをコピーさせることができます。変更したいイベントを追加/削除/置き換えます。 私は上記の 'JsonParser'の例を忘れていたことに気付きました。その入力を得る場所を発電機に知らせることは明らかに必要です。 – StaxMan