ファイルの最後に毎回文字列をテキストファイルに書き込みたい。そして、テキストファイルで特定の文字列を検索して見つけた場合、その行を別の行に置き換えたいと思います。
私はこれを考えています:テキストファイルの行を数え、+1を追加してから、書きたい文字列をそのインデックスに書き込みます。しかし、テキストファイルの特定の行番号に書き込むことさえ可能ですか?
そして、特定の行を別の文字列に更新するのはどうですか?
ありがとう!
ファイルの最後に毎回文字列をテキストファイルに書き込みたい。そして、テキストファイルで特定の文字列を検索して見つけた場合、その行を別の行に置き換えたいと思います。
私はこれを考えています:テキストファイルの行を数え、+1を追加してから、書きたい文字列をそのインデックスに書き込みます。しかし、テキストファイルの特定の行番号に書き込むことさえ可能ですか?
そして、特定の行を別の文字列に更新するのはどうですか?
ありがとう!
あなたはそれをしたくありません:それは災害のレシピです。元のファイルの変更中に書き込みに失敗すると、元のファイルが破損します。
二重書き込みプロトコルを使用し、変更されたファイルを別のファイルに書き込みます。書き込みが成功した場合にのみ、そのファイルの名前を元のファイルに変更します。
ファイルが大きすぎない場合は、「大きい」の定義List<String>
として、宛先ファイル用にを作成することをお勧めします。元のファイルを1行ずつ読み取り、そのリストに追加します。リストの処理が完了したら(質問は実際に何が起こるかわからない)、それぞれString
を他のファイルに書き込み、フラッシュして閉じ、それが成功した場合は、元のファイルに名前を変更します。
文字列を追加する場合、FileOutputStreamには true に設定できる代替コンストラクターがあり、追加用に開くことができます。
たとえば、文字列をコピーせずにファイルに置き換えたい場合は、代わりにRandomAccessFileを使用することをお勧めします。ただし、ラインの長さが変化する場合、これは信頼できません。固定長レコードの場合、これは次のように機能するはずです。
また、(setLength を使用して) '切り詰める' こともできるため、末尾のブロックを取り除く必要がある場合は、そのように破棄することができます。
3 番目の解決策は、mmap に依存することです。これには、ファイル全体のメモリ マップ バイトバッファが必要です。ソリューションの実現可能性全体を考慮しているわけではありませんが (プレーン C で動作します)、Java プラットフォームとオペレーティング システムの両方を考慮すると、実際にはより正確に「見えます」。