Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android/Java中读写文件时跳过部分_Java_Android - Fatal编程技术网

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

在Android/Java中读写文件时跳过部分,java,android,Java,Android,我正在尝试学习Java/Android,现在我正在用replaceAll函数做一些实验。但我发现,对于大型文本文件,处理过程会变得缓慢,因此我想知道是否有办法跳过文件中“无用”的部分,以获得更好的性能。(注意:只需跳过它们,而不是删除它们) 注意:我没有试图“计数行”或“println”或“system.out”,我只是替换字符串并将更改保存在同一个文件中 范例 AAAA 中交9234802394819102948102948104981209381'238901'2309'129831'238

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

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

范例

AAAA

中交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

AAAA

中交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

等等……就像无数次

我想用“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%)


有人知道解决方法吗?

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

在Java中,
String
是不可变的,这意味着您不能修改它们。因此,当您进行连接时,Java实际上是在制作
oldtext
的完整副本。因此,对于文件中的每一行,您都在重新复制新
字符串中之前出现的每一行。请看一看构建
字符串的方法,以避免这些副本

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

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

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

谢谢你的回复。这个代码的执行速度比我的原始代码快得多。但是我必须假设没有办法避免读取整个文件。@user2012897通常是这样,您不能。因为在准备好这些行之前,您不知道这些行实际将有多少字节长。
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();