我需要从文本文件中读取,用“\ 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();
}
答案 0 :(得分:3)
答案 1 :(得分:3)
还有其他方法可以更快地实现它吗?
主要瓶颈是这句话:
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&#34;尝试使用资源&#34;句法。在try-catch-finally语句完成时,资源(即流)将自动关闭。
答案 2 :(得分:2)
如果你使用某种类型的Unix,你可以使用命令行。
sed 's/,/\n/g' input.txt > output.txt
答案 3 :(得分:1)
花费时间连接字符串。没有必要这样做。您可以在完成处理时写出每一行,或者确实是每个字符:如果是后者,请确保将FileWriter
包裹在BufferedWriter.