0

私は Java/Android を学習しようとしていますが、現在、replaceAll関数を使っていくつかの実験を行っています。しかし、大きなテキスト ファイルでは処理が遅くなることがわかったので、ファイルの「役に立たない」部分をスキップしてパフォーマンスを向上させる方法があるかどうか疑問に思っていました。(注: 削除せずにスキップしてください)

注:「行数」、「println」、または「system.out」を試みているわけではありません。文字列を置き換えて、変更を同じファイルに保存しているだけです。

ああああ

CCCC- 9234802394819102948102948104981209381'238901'2309'129831'2381'2381'23081'23081'284091824098304982390482304981'20841'948023984129048'1489039842039481'204891'29031'923481290381'20391'294872385710239841'20391'20931'20853029573098341'290831'20893'12894093274019799919208310293810293810293810293810298'120931¿ 2093�12039�120931�203912�0391�203912�039�12093�12093�12093�12093�12093�12093120390�... �DDDD

ああああ

CCCC- 9234802394819102948102948104981209381'238901'2309'129831'2381'2381'23081'23081'284091824098304982390482304981'20841'948023984129048'1489039842039481'204891'29031'923481290381'20391'294872385710239841'20391'20931'20853029573098341'290831'20893'12894093274019799919208310293810293810293810293810298'120931¿ 2093�12039�120931�203912�0391�203912�039�12093�12093�12093�12093�12093�12093120390�... �DDDD

など....無数のように

すべての"AAAA""BBBB"に置き換えたいのですが、置き換えている文字列の間にデータの大部分があります。また、この部分は常に"CCCC"で始まり"DDDD"で終わります。

文字列を置き換えるために使用しているコードは次のとおりです。

File file = new File("my_file.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = "", oldtext = "";
while((line = reader.readLine()) != null) {
   oldtext += line + "\r\n";
}
reader.close();

// Replacing "AAAA" strings
String newtext= oldtext.replaceAll("AAAA", "BBBB");

FileWriter writer = new FileWriter("my_file.txt");
writer.write(newtext);
writer.close();

すべての行を読み取るのは、特にこれらの部分を変更しない場合 (ファイルの 90% を占める場合) は非効率的だと思います。

誰かが解決策を知っていますか???

4

1 に答える 1

0

あなたはこの行で多くの時間を無駄にしています --

oldtext += line + "\r\n";

Java ではString不変です。つまり、それらを変更することはできません。したがって、連結を行うと、Java は実際には の完全なコピーを作成していますoldtext。したがって、ファイルのすべての行について、新しいString. これらのコピーを回避StringBuilderする方法を確認してください。String

ただし、あなたの場合、行ごとに処理できるため、メモリ内のファイル全体は必要ありません。replaceAllandをループに移動するwriteことで、読みながら各行を操作できます。これにより、メモリ内に 1 行しか保持されないため、ルーチンのメモリ フットプリントを抑えることができます。

FileWriterは入力ファイルを読み取る前に開かれるため、出力ファイルには別の名前を付ける必要があることに注意してください。同じ名前を保持したい場合は、閉じrenameToFile後に実行できます。

File file = new File("my_file.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
FileWriter writer = new FileWriter("my_out_file.txt");
String line = "";
while((line = reader.readLine()) != null) {
    // Replacing "AAAA" strings
    String newtext= line.replaceAll("AAAA", "BBBB");    
    writer.write(newtext);
}
reader.close();
writer.close();
于 2013-01-26T05:19:01.447 に答える