API для простых функций File (количество строк) в Java - PullRequest
4 голосов
/ 14 марта 2012

Привет: Учитывая произвольный файл (Java), я хочу посчитать строки.

Это достаточно просто, например, с помощью метода Apache FileUtils.readLines (...) ...

Однако для больших файлов чтение целого файла на месте нелепо (то есть просто для подсчета строк).

Один домашний вариант: создайте BufferedReader или используйте функцию FileUtils.lineIterator и подсчитайте количество строк.

Тем не менее, Я предполагаю, что может существовать (низкий объем памяти), современный API для выполнения простых операций с файлами с минимальным количеством рабочей области для Java. Существуют ли какие-либо такие библиотеки или функции где-нибудь в любом из Google, Apache и т. д ... библиотек Java с открытым исходным кодом?

Ответы [ 4 ]

6 голосов
/ 14 марта 2012

С Гуавой :

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

, которая не будет содержать весь файл в памяти или что-либо еще.

3 голосов
/ 12 октября 2015

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 в этой задаче вообще.

1 голос
/ 14 марта 2012

без библиотеки:

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;
}
0 голосов
/ 14 ноября 2013

Вот версия, которая использует библиотеку 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;
}
...