[英]Run time optimisation
我需要从文本文件读取,将所有“,”替换为“ \\ n”,然后将结果写入新的文本文件。 我的文本文件很大(16MB),需要几个小时才能完成此任务。 还有其他方法可以更快地实现它吗?
public static void main(String [] args) throws IOException {
String fileName = "file1.txt"; // The name of the file to open.
String s=""; // This will reference one line at a time
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
int c, n=0;
char character;
while((c = reader.read()) != -1) {
character = (char) c;
if ( character == ',')
s = s + "\n";
else
s += character;
}
reader.close();
PrintWriter out = new PrintWriter("fileName1.txt");
out.println(s);
out.close();
}
还有其他方法可以更快地实现它吗?
主要瓶颈是以下语句:
if ( character == ',')
s = s + "\n";
else
s += character;
基本上,您正在为输入文件中的每个单个字符进行字符串连接。 如果文件中有N个字符,则说明您正在创建N个字符串,而这些级联将复制大约N * (N + 1) / 2
字符。 如果N为16,000,000
,那么您正在谈论的是复制的大量字符。 (还有很多垃圾收集。)
如果您只是想避免串联,解决方案是将String s
替换为StringBuilder s
...,然后使用append
操作来构建输出字符串。
但是,在这种情况下,最好的解决方案是为输出文件打开BufferedWriter
并将字符直接写到该文件...而无需构建内存中的字符串。
跟进
你什么意思?
我的意思是这样的:
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader("in.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("out.txt"))) {
int c;
char character;
while ((c = reader.read()) != -1) {
character = (char) c;
if (character == ',')
writer.write('\n');
else
writer.write(character);
}
}
}
请注意,我正在使用Java 7“尝试使用资源”语法。 在try-catch-finally语句完成时,资源(即流)将自动关闭。
如果您使用某种Unix,则可以使用命令行。
sed 's/,/\n/g' input.txt > output.txt
时间花费在连接字符串上。 没有必要这样做。 您可以在处理完每一行后写出每一行,或者也可以写出每个字符:如果是后者,请确保将FileWriter
包装在BufferedWriter.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.