在Android / Java中读取和写入文件时跳过部分

时间:2013-01-26 04:10:34

标签: java android

我正在尝试学习Java / Android,现在我正在使用replaceAll函数进行一些实验。但我发现,对于大文本文件,这个过程变得缓慢,所以我想知道是否有办法跳过文件的“无用”部分以获得更好的性能。 (注意:只需跳过它们,不要删除它们)

注意:我不是要“计算行数”或“println”或“system.out”,我只是替换字符串并将更改保存在同一个文件中。

实施例

AAAA

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¿1209312¿0390¿... DDDD < / p>

AAAA

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¿1209312¿0390¿... DDDD < / p>

依此类推......就像无数次

我想用“BBBB”替换所有“AAAA”,但我要替换的字符串之间有大量数据。此外,这些部分始终以“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%)。

有谁知道解决方案???

1 个答案:

答案 0 :(得分:0)

你在这条线上浪费了很多时间 -

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

在Java中,String是不可变的,这意味着您无法修改它们。因此,当您进行连接时,Java实际上正在制作oldtext的完整副本。因此,对于文件中的每一行,您都要重新复制新String中之前的每一行。请查看StringBuilder,了解如何构建String以避免这些副本。

但是,在您的情况下,您不需要内存中的整个文件,因为您可以逐行处理。通过将replaceAllwrite移动到循环中,您可以在阅读时对每一行进行操作。这将使例程的内存占用减少,因为您只在内存中保留一行。

请注意,由于在读取输入文件之前打开了FileWriter,因此您需要为输出文件指定不同的名称。如果您想保留相同的名称,可以在关闭后在File上执行renameTo

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();