运行时优化

时间:2013-08-07 03:19:29

标签: java optimization file-io fileinputstream fileoutputstream

我需要从文本文件中读取,用“\ 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();
}

4 个答案:

答案 0 :(得分:3)

  1. 不是逐字逐句阅读,而是逐行阅读。
  2. 对于每一行读取,请通过调用replaceAll()方法将所有逗号替换为“\ n”。
  3. 使用BufferedWriter

答案 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.