2

更新が必要な文字列を含むファイルが 1 つあります。

MY REPORT
REPORT RUN DATE : 27/08/2012 12:35:11 PAGE 1 of @TOTAL@                                              
SUCCESSFUL AND UNSUCCESSFUL DAILY TRANSACTIONS REPORT                                                                                    
---record of data here----

MY REPORT                                                                                                                                                 
REPORT RUN DATE : 27/08/2012 12:35:11 PAGE 2 of @TOTAL@                                              
SUCCESSFUL AND UNSUCCESSFUL DAILY TRANSACTIONS REPORT
---record of data here----

@TOTAL@ のすべての発生をある数値に更新したいだけの場合、これを行うための迅速かつ効率的な方法はありますか?

BufferedReader+BufferedWriter を使用して別のファイルに出力し、途中で String.replace を使用することもできることは理解していますが、これを解決するためのより適切でエレガントな方法があるかどうか疑問に思っています...

ファイルは10MBを超えることはないので、ファイルが大きくなる可能性があるかどうかを心配する必要はありません(1 GBを超えるなど)

4

2 に答える 2

2

ファイルが大きすぎることを気にせず、replace()すべての行で呼び出すのはエレガントではないと思う場合は、ファイル全体を単一の文字列に読み取り、replace()一度呼び出してからファイルに書き込むことができると思います。

于 2012-08-27T05:07:29.557 に答える
1

...これを解決するためのより良いエレガントな方法があるのだろうか

「より良くエレガント」が何を意味するかによって異なりますが、IMO の答えはノーです。

ファイルは10MBを超えることはないので、ファイルが大きくなる可能性があるかどうかを心配する必要はありません(1 GBを超えるなど)

1Gb を超える可能性はほとんどありません。でも:

  • おそらく、ファイルが 10Mb を超えないことを 100% 確信することはできません。有効期間が長いプログラムの場合、要件と使用パターンが時間の経過とともに変化しないことを知ることはほとんどありません。

  • 実際、10Mb のテキスト ファイル全体を StringBuilder にロードすると、最大 60Mb のメモリを占有する可能性があります。まず、バイトが文字に膨らみます。次に、バッキング配列を管理するために StringBuilder が使用するアルゴリズムには、元の配列の 2 倍のサイズの新しい配列を割り当てることが含まれます。そのため、ピーク時のメモリ使用量は、読み取り中のファイルのバイト数の最大 6 倍になる可能性があります。

  • 一部のプラットフォームの一部の JVM では、60Mb がデフォルトの最大ヒープ サイズよりも大きいことに注意してください。

于 2012-08-27T05:59:17.127 に答える