在 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中文网其他相关文章!