4

我有一個由數據行組成的數據文件,換行符分隔。我需要將文件的內容讀入字符串數組中,並且我想高效地創建正確大小的數組。它是最有效的什麼是確定文本文件長度的最有效方法?

  1. 使用ArrayList,
  2. 掃描通過使用BufferedReader類,標誌着開始,計數線,然後回正在重置至刻度, 或
  3. 文件???
+0

我們在談論什麼大小的文件? – moodywoody 2012-04-02 04:39:42

+0

幾百行,但我想任何大小的文件的答案。 – TravisThomas 2012-04-02 04:45:16

回答

5

使用ArrayList(您的選項#1)。用BufferedReaderreadLine()方法逐行讀入文本文件。它簡單,高效和可維護。

+1

在Java 7 a引入新的包和類,java.nio.file.Files:'List allLines = Files.readAllLines(Paths.get(filename),Charset.forName(「iso-8859-1」));' – Kennet 2012-04-02 07:13:07

+0

@Kennet,有沒有這種方法的任何性能改進 – UVM 2012-04-07 15:01:25

+0

我還沒有測試過。但是寫起來比我通常傾向於做的要短得多。 – Kennet 2012-04-09 18:12:50

1

最好的辦法是用一個操作讀入整個文件。這是因爲磁盤IO通常相對較慢,並且可能是應用程序中速度最慢的部分。將整個文件讀入一個大字符串,然後在新行標記('\ n')上使用split。這可能是最簡單,最有效的方法。 Split()將爲您生成一個包含數據的字符串數組。

+0

如何將整個文件讀入字符串? – TravisThomas 2012-04-02 04:41:16

+0

您可以嘗試File.readFileToString:http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html#readFileToString%28java.io.File%29 – Oleksi 2012-04-02 04:45:51

2

這取決於文件的大小和什麼樣的效率,你需要:

  1. 的ArrayList是一種簡單而有效的選擇。只需創建一個新實例並逐個從BufferedReader中添加字符串。然後在這個列表上調用toArray()。

  2. 將整個文件作爲字符串讀取並手動分割(我相信效率更高),或者將java.lang.String提供的正則表達式分割爲字符串數組。如果您手動執行此操作,則可以計算「\ r \ n」符號的數量並創建一個確切大小的數組(即,您將保存數組列表重新分配)。

2

您可以使用ArrayList和使用優化下面的方法它的大小:

  • trimToSize:修剪此ArrayList實例的容量是列表的當前大小。應用程序可以使用此操作來最小化ArrayList實例的存儲。
  • ensureCapacity:如有必要,增加此ArrayList實例的容量,以確保它至少能容納由最小容量參數指定的元素數量。

此外,如果您知道每行的平均大小,您可以嘗試確定基於文件長度(file_size/line_avg_size)的數組大小。

2

ArrayList比你的第二個更可取。

我不想用我自己的代碼重新發明車輪,當有經過驗證的解決方案時。

1

創建一個編寫器來計算寫入的字符數,並使用它來包裝您的OutputStreamWriter。

注:正確的方式來保存的文本文件是:

new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding)));

的編碼是很重要的;它通常是「UTF-8」。

這個鏈給你兩個地方,你可以注入你的包裝:你可以包裝作家得到的字符數或內部OutputStream得到字節寫入。

0

3:使用掃描儀(自1.5):懶惰(但惡意)的程序員工具,具有字符串掃描所需的所有選項,並對所有文件有效。

+0

掃描儀不提供任何方法來確定文件的長度。 – TravisThomas 2012-04-02 06:52:48

+0

@ trav1th:因爲它不會在內存中加載文件,對於任何文件大小它都是一個好工具(沒有'堆空間'問題)。在Java 7中,nio.file.Files.size(PathOfFile)給出了其他有用方法的大小。這也是對3的迴應?這可以表明,第一次接近並不是最合適的。 – 2012-04-02 07:19:35

相關問題