如何以有效的方式获取文件中的行数?

fir*_*umb 67 java file

我有一个大文件.它包括大约3.000-20.000行.如何使用Java获取文件中的行总数?

Mne*_*nth 106

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
int lines = 0;
while (reader.readLine() != null) lines++;
reader.close();
Run Code Online (Sandbox Code Playgroud)

更新:为了回答这里提出的性能问题,我做了一个测量.第一件事:20.000行太少,以使程序运行一段时间.我创建了一个包含500万行的文本文件.这个解决方案(从没有像-server或-XX-options这样的参数的java开始)在我的盒子上需要大约11秒.与wc -l(UNIX命令行工具计数行)相同,为11秒.读取每个字符并寻找'\n'的解决方案需要104秒,9-10倍.

  • 检查每个字节应该肯定更快(使用缓冲区时),因为FileReader必须将字节解码为文本. (2认同)

Aug*_*tin 55

Files.lines

Java的8+具有使用一个很不错的一小段路NIO使用Files.lines.

Path path = Paths.get("./big_file.txt");
long lineCount = Files.lines(path).count();
Run Code Online (Sandbox Code Playgroud)

UTF-8中的默认字符编码.您可以指定备用编码以匹配您的特定数据文件.

  • 床解。我们可能遇到字符集问题 (2认同)
  • 字符集默认为 UTF-8 (2认同)
  • Files.lines(path).count(); 不应该直接使用。而是尝试使用资源。示例:long lineCount; 尝试(Stream <String> linesStream = Files.lines(path)){lineCount = linesStream.count(); } (2认同)

Nar*_*yan 32

使用LineNumberReader

就像是

public static int countLines(File aFile) throws IOException {
    LineNumberReader reader = null;
    try {
        reader = new LineNumberReader(new FileReader(aFile));
        while ((reader.readLine()) != null);
        return reader.getLineNumber();
    } catch (Exception ex) {
        return -1;
    } finally { 
        if(reader != null) 
            reader.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能还需要关闭()读者. (2认同)
  • 你可能要在finally块中检查读者!= null (2认同)

bri*_*rig 10

我找到了一些解决方案,它可能对你有用

下面是代码片段,计算文件中的no.of行.

  File file = new File("/mnt/sdcard/abc.txt");
  LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(file));
  lineNumberReader.skip(Long.MAX_VALUE);
  int lines = lineNumberReader.getLineNumber();
  lineNumberReader.close();
Run Code Online (Sandbox Code Playgroud)


Esk*_*ola 5

通读文件并计算换行符的数量。在 Java 中读取文件的一种简单方法(一次一行)是java.util.Scanner类。


ZZ *_*der 5

这大约是它能达到的最高效率,缓冲二进制读取,没有字符串转换,

FileInputStream stream = new FileInputStream("/tmp/test.txt");
byte[] buffer = new byte[8192];
int count = 0;
int n;
while ((n = stream.read(buffer)) > 0) {
    for (int i = 0; i < n; i++) {
        if (buffer[i] == '\n') count++;
    }
}
stream.close();
System.out.println("Number of lines: " + count);
Run Code Online (Sandbox Code Playgroud)


mat*_*att 5

您需要精确的行数还是只需要近似值?我碰巧并行处理大文件,并且通常不需要知道确切的行数 - 然后我恢复采样。将文件分成 10 个 1MB 的块,计算每个块中的行数,然后将其乘以 10,您将得到行数的相当好的近似值。