2013-08-07 46 views
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(); 
} 

回答

3

是否有更快的實現它的任何其他方式?

主要瓶頸是這樣一句話:

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

基本上,你在做字符串連接在輸入文件的每一個字符。如果文件中有N個字符,則您正在創建N個字符串,並且這些並置是複製大致N * (N + 1)/2個字符。如果N是16,000,000,那麼你正在談論一個龐大的複製的字符數。 (和很多垃圾收集的了。)

如果你只是想避免串聯,該解決方案將與StringBuilder s更換String 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語句後自動關閉。

+0

你是什麼意思?如果有一種方法不使用String,那會更好。我如何從輸出文件讀取,將「,」更改爲「/ n」,並直接寫入字符? – Ryainad

+0

謝謝!它現在正在工作!以光速! – Ryainad

3
  1. ,而不是由文字讀取字符,由行讀線。
  2. 對於每行讀取,請通過調用replaceAll()方法將所有逗號替換爲「\ n」。
  3. 使用的BufferedWriter
+0

前兩個想法可能無濟於事。按字符處理的字符最有可能是最快的......只要您不嘗試將全部內容存儲在內存中。 –

+0

如果Java提取加載大塊文件和字節之間的速度差異,我會留下深刻的印象。 –

+0

@MattBryant - 「BufferedReader」和「BufferedWriter」應該注意這一點。可能有更快的方法(使用NIO/CharBuffer等),但逐個字符處理是「足夠接近」的。它應該減少運行時間(比如說)幾秒鐘。 –

2

如果您正在使用某種形式的Unix下,你可以使用命令行這一點。

sed 's/,/\n/g' input.txt > output.txt 
+0

謝謝你的建議,現在好多了! – Ryainad

+0

我使用Mac,它不工作。 – Ryainad

+0

*什麼*不起作用? –

1

花費時間連接字符串。沒有必要這樣做。你可以寫出來的每一行處理完呢,還是確實是每一個字符:如果是後者,請確保您纏繞FileWriterBufferedWriter.