テキストファイルから特定の行を読み取る方法はありますか? APIまたはApacheCommons内。何かのようなもの :
String readLine(File file, int lineNumber)
実装するのは簡単だと思いますが、ファイルが非常に大きい場合は特に効率的ではありません。
_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(..)
を見て、(正規表現を使用して)行全体をスキップしてみてください。それがより効率的になるかどうかはわかりません-ベンチマークしてください。
P.S. withefficiencyつまりメモリ効率
私が知っていることではありません。
行の開始位置に関してファイルに特定のインデックスがないことに注意してください。したがって、ユーティリティメソッドは次のように正確に効率的です。
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(もちろん、適切なエラー処理とリソースを閉じるロジックを使用します)。
読んでいた行がall同じ長さの場合、計算が役立つ場合があります。
しかし、行の長さが異なる状況では、行数が正しくなるまで、一度に1つずつ読み取る以外に方法はないと思います。
残念ながら、ファイル内のすべての行が正確に同じ長さであることを保証できない限り、ファイル全体、または少なくとも目的の行までを読み取る必要があります。
行数を数える唯一の方法は、ファイル内の改行文字を探すことです。これは、各バイトを読み取る必要があることを意味します。
コードを最適化して見やすく読みやすくすることは可能ですが、その下では常にファイル全体を読み取ることになります。
同じファイルを何度も読み取る場合は、ファイルを解析して、特定の行番号のオフセットを格納するインデックスを作成できます。たとえば、行100、200などのバイト数などです。
ファイルはバイトであり、行指向ではないため、一般的なソリューションの複雑さは、せいぜいO(n)で、nはバイト単位のファイルサイズです。ファイル全体をスキャンして行を数える必要があります。ファイルのどの部分を読みたいかがわかるまで区切り文字。
guava 似たようなものがあります:
List<String> Files.readLines(File file, Charset charset);
だからあなたはすることができます
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
File Utilsの使用:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
同じファイルを同じ方法で操作する場合(特定の行のテキストを探す場合)、ファイルにインデックスを付けることができます。行番号->オフセット。
これによると answer 、Java 8を使用すると、ファイルから特定の行を抽出できます。その回答に例が示されています。