4

こんにちは:任意のファイル(java)が与えられた場合、行数を数えたいと思います。

これは、たとえば、ApacheのFileUtils.readLines(...)メソッドを使用すると非常に簡単です...

ただし、大きなファイルの場合、ファイル全体をその場で読み取るのはばかげています(つまり、行を数えるだけです)。

自家製のオプションの1つ:BufferedReaderを作成するか、FileUtils.lineIterator関数を使用して、行数を数えます。

ただし、Java用の最小限のボイラープレートで単純な大きなファイル操作を実行するための(メモリが少ない)最新のAPIがある可能性があると思います---そのようなライブラリまたは機能はいずれかのどこかに存在しますかGoogle、Apacheなど...オープンソースのJavaユーティリティライブラリ?

4

4 に答える 4

6

グアバと:

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

これは、ファイル全体をメモリなどに保持しません。

于 2012-03-13T20:21:11.667 に答える
3

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オブジェクトはまったく必要ありません。

于 2015-10-12T16:24:21.393 に答える
1

ライブラリなし:

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;
}
于 2012-03-13T20:28:51.173 に答える
0

これは、ApacheCommonsIOライブラリを利用するバージョンです。プラットフォームのデフォルトを選択する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;
}
于 2013-11-14T17:43:25.010 に答える