使用Java更新文件中所有出现的字符串

使用Java更新文件中所有出现的字符串,java,file,Java,File,我有一个文件,其中包含一些需要更新的字符串 MY REPORT REPORT RUN DATE : 27/08/2012 12:35:11 PAGE 1 of @TOTAL@ SUCCESSFUL AND UNSUCCESSFUL DAILY TRANSACTIONS REPORT

我有一个文件,其中包含一些需要更新的字符串

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,因此不必担心文件是否会太大(超过1GB等)

如果您不关心文件太大,并且认为每行调用
replace()
都不雅观,我想您可以将整个文件读入一个字符串,调用
replace()
一次,然后将其写入文件

。。。我想知道是否有更好更优雅的方法来解决这个问题

这取决于你所说的“更好、优雅”是什么意思,但在我看来,答案是否定的

该文件不会超过10MB,因此无需担心文件是否太大(超过1GB等)

您不太可能超过1Gb。然而:

  • 您可能无法100%确定该文件不会超过10Mb。对于任何具有重要生命周期的程序,您很少知道需求和使用模式不会随时间而改变

  • 事实上,如果将整个批次加载到StringBuilder中,一个10Mb的文本文件可能会占用多达60Mb的内存。首先,将字节膨胀为字符。其次,StringBuilder用于管理其备份数组的算法涉及到分配一个新数组,该数组的大小是原始数组的两倍。因此,峰值内存使用率可能是您正在读取的文件中字节数的6倍

  • 注意,对于某些平台上的某些JVM,60Mb大于默认的最大堆大小


然而,我必须满足每页记录之间的对齐。@Rudy不知道您关于对齐的意思,这与“一些数字”有关吗?