21

テキストファイルから特定の行を読み取る方法はありますか?APIまたはApacheCommonsで。何かのようなもの :

String readLine(File file, int lineNumber)

実装するのは簡単だと私は同意しますが、ファイルが非常に大きい場合は特に効率的ではありません。

4

9 に答える 9

17
String line = FileUtils.readLines(file).get(lineNumber);

できますが、それでも効率の問題があります。

または、次を使用することもできます。

 LineIterator it = IOUtils.lineIterator(
       new BufferedReader(new FileReader("file.txt")));
 for (int lineNumber = 0; it.hasNext(); lineNumber++) {
    String line = (String) it.next();
    if (lineNumber == expectedLineNumber) {
        return line;
    }
 }

バッファがあるため、これはわずかに効率的です。

見てScanner.skip(..)、行全体をスキップしてみてください(正規表現を使用)。それがより効率的かどうかはわかりません-ベンチマークします。

効率の良いPS私はメモリ効率意味します

于 2010-01-26T09:17:42.140 に答える
5

私が知っていることではありません。

行の開始位置に関してファイルに特定のインデックスがないことに注意してください。したがって、ユーティリティメソッドは次のように正確に効率的です。

BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
   r.readLine();
}
return r.readLine();

(もちろん、適切なエラー処理とリソースを閉じるロジックを使用します)。

于 2010-01-26T09:18:48.997 に答える
1

読んでいた行がすべて同じ長さである場合は、計算が役立つ場合があります。

しかし、行の長さが異なる状況では、行数が正しくなるまで、一度に1つずつ読み取る方法はないと思います。

于 2010-01-26T09:18:02.373 に答える
1

残念ながら、ファイル内のすべての行が完全に同じ長さであることを保証できない限り、ファイル全体、または少なくとも後の行までを読み取る必要があります。

行数を数える唯一の方法は、ファイル内の改行文字を探すことです。これは、各バイトを読み取る必要があることを意味します。

コードを最適化して見やすく読みやすくすることは可能ですが、その下では常にファイル全体を読み取ることになります。

同じファイルを何度も読み取る場合は、ファイルを解析して、特定の行番号のオフセットを格納するインデックスを作成できます。たとえば、行100、200などのバイト数などです。

于 2010-01-26T09:19:59.403 に答える
1

ファイルはバイトであり、行指向ではないため、一般的なソリューションの複雑さはせいぜいO(n)であり、nはバイト単位のファイルサイズです。ファイル全体をスキャンし、ファイルのどの部分を読みたいかがわかるまで行区切り文字を数える必要があります。

于 2010-01-26T09:20:14.973 に答える
1

グアバには似たようなものがあります:

List<String> Files.readLines(File file, Charset charset);

だからあなたはすることができます

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
于 2010-01-26T09:21:35.993 に答える
1

File Utilsの使用:

File fileFeatures = new File(
                "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
于 2015-09-14T15:39:12.570 に答える
0

同じファイルを同じ方法で操作する場合(特定の行のテキストを探す場合)、ファイルにインデックスを付けることができます。行番号->オフセット。

于 2010-01-26T09:18:35.907 に答える
0

この回答によると、 Java8ではファイルから特定の行を抽出できます。その答えに例が示されています。

于 2016-04-12T19:32:25.573 に答える