在Java 中計算大型資料檔案中的行數
計算大量資料檔案中的行數可能是一項艱鉅的任務。雖然逐行迭代檔案是一種常見的方法,但它既耗時又低效。
更有效的替代方法是利用以下最佳化方法:
public static int countLines(String filename) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(filename)); try { byte[] c = new byte[1024]; int count = 0; int readChars = 0; boolean empty = true; while ((readChars = is.read(c)) != -1) { empty = false; for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') { ++count; } } } return (count == 0 && !empty) ? 1 : count; } finally { is.close(); } } public static int countLinesNew(String filename) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(filename)); try { byte[] c = new byte[1024]; int readChars = is.read(c); if (readChars == -1) { // bail out if nothing to read return 0; } // make it easy for the optimizer to tune this loop int count = 0; while (readChars == 1024) { for (int i = 0; i < 1024;) { if (c[i++] == '\n') { ++count; } } readChars = is.read(c); } // count remaining characters while (readChars != -1) { for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') { ++count; } } readChars = is.read(c); } return count == 0 ? 1 : count; } finally { is.close(); } }
此方法以1024 位元組為單位讀取文件,與逐行讀取相比,顯著減少了檔案系統訪問次數。它維護每個區塊期間遇到的行數並累積總計數。
基準測試表明,此方法比使用 LineNumberReader 快得多。對於1.3GB的文字文件,最佳化方法統計行數大約需要0.35秒,而LineNumberReader大約需要2.40秒。
以上是如何有效率地計算大型 Java 資料檔中的行數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!