API,用于Java中的简单File(行数)函数



嗨:给定一个任意文件(java),我想计算行数。

这很简单,例如,使用Apache的FileUtils.readLines(…)方法。。。

然而,对于大文件来说,在适当的位置读取整个文件是很可笑的(即只计算行数)。

一个自行开发的选项:创建BufferedReader或使用FileUtils.lineIterator函数,并计算行数。

然而,我假设可能有一个(低内存)、最新的API,用于用最少的java锅炉板进行简单的大型文件操作——在任何Google、Apache等开源java实用程序库中,是否存在任何此类库或功能

使用番石榴:

int nLines = Files.readLines(file, charset, new LineProcessor<Integer>() {
  int count = 0;
  Integer getResult() {
    return count;
  }
  boolean processLine(String line) {
    count++;
    return true;
  }
});

它不会将整个文件保存在内存或任何东西中。

Java 8捷径:

 Files.lines(Paths.get(fileName)).count();

但大多数内存效率:

try(InputStream in = new BufferedInputStream(new FileInputStream(name))){
    byte[] buf = new byte[4096 * 16];
    int c;
    int lineCount = 0;
    while ((c = in.read(buf)) > 0) {
       for (int i = 0; i < c; i++) {
           if (buf[i] == 'n') lineCount++;
       }
    }
}

在这个任务中根本不需要String对象。

没有库:

public static int countLines(String filename) throws IOException {
    int count = 0;
    BufferedReader br = new BufferedReader(new FileReader(filename));
    try {
        while (br.readLine() != null) count++;
    } finally { 
        br.close(); 
    }
    return count;
}

这里有一个使用Apache Commons IO库的版本。您可以将null传递给encoding以选择平台默认值。

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
public static long countLines(String filePath, String encoding)
throws IOException {
    File file = new File(filePath);
    LineIterator lineIterator = FileUtils.lineIterator(file, encoding);
    long lines = 0;
    try {
        while ( lineIterator.hasNext() ) {
            lines++;
            lineIterator.nextLine();
        }
    } finally {
        LineIterator.closeQuietly( lineIterator );
    }
    return lines;
}

相关内容

  • 没有找到相关文章

最新更新