0

我需要从文本文件中读取,将所有“,”替换为“\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

4 回答 4

3
  1. 不是逐个字符地阅读,而是逐行阅读。
  2. 对于读取的每一行,通过调用replaceAll()方法将所有逗号替换为“\n” 。
  3. 使用 BufferedWriter
于 2013-08-07T03:26:31.663 回答
3

有没有其他方法可以更快地实现它?

主要瓶颈是以下语句:

       if ( character == ',')
           s = s + "\n";
       else
           s += character;

基本上,您正在为输入文件中的每个字符进行字符串连接。如果文件中有 N 个字符,则您正在创建 N 个字符串,并且连接大致复制N * (N + 1) / 2了字符。如果 N 是16,000,000,那么您正在谈论大量复制的字符。(还有很多垃圾收集。)

如果您只是想避免串联,解决方案是替换String sStringBuilder 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 语句完成后自动关闭。

于 2013-08-07T03:45:44.743 回答
2

如果您使用的是某种 Unix,则可以使用命令行。

sed 's/,/\n/g' input.txt > output.txt
于 2013-08-07T03:28:16.103 回答
1

时间花在连接字符串上。没有必要这样做。您可以在完成处理后写出每一行,或者实际上是每个字符:如果是后者,请确保FileWriterBufferedWriter.

于 2013-08-07T03:30:35.533 回答