非常に大きなテキスト ファイルがあり、最後の近くのどこかからデータを収集する必要があります。おそらく、スキャナーはこれを行うための最良の方法ではありませんが、ファイルの目的の部分に到達する前に、先頭から開始して6000行を取得するのは非常に無駄です。スキャナーにジャンプするように指示する方法はありますかドキュメントの 7/8 と言うか、下から始めて上にスキャンして行ごとにつかみますか?
ありがとう
非常に大きなテキスト ファイルがあり、最後の近くのどこかからデータを収集する必要があります。おそらく、スキャナーはこれを行うための最良の方法ではありませんが、ファイルの目的の部分に到達する前に、先頭から開始して6000行を取得するのは非常に無駄です。スキャナーにジャンプするように指示する方法はありますかドキュメントの 7/8 と言うか、下から始めて上にスキャンして行ごとにつかみますか?
ありがとう
a の基本的な入力ソースjava.util.Scanner
は ajava.lang.Readable
です。Scanner(File)
コンストラクターを超えて、 aScanner
はファイルをスキャンしているという事実を知りませんし、気にもしません。
また、 に基づく正規表現であるためjava.util.regex.*
、逆方向にスキャンする方法はありません。
やりたいことを達成するには、入力ソース レベルで実行するのが最善です。たとえばInputStream.skip
、ソースを のコンストラクタに渡す前に を使用しScanner
ます。
Scanner.skip
Scanner
それ自体には ,skip
のようなパターンがあり、 (シングルライン/モードで) "(?s).{10}"
10 文字をスキップしますが、これはおそらくかなり遠回りな方法です。(?s)
Pattern.DOTALL
skip
指定した行数をスキップするために使用する例を次に示します。
String text =
"Line1 blah blah\n" +
"Line2 more blah blah\n" +
"Line3 let's try something new \r\n" +
"Line4 meh\n" +
"Line5 bleh\n" +
"Line6 bloop\n";
Scanner sc = new Scanner(text).skip("(?:.*\\r?\\n|\\r){4}");
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
これは出力します ( ideone.com で見られるように):
Line5 bleh
Line6 bloop
Scanner
をラップするInputStream
と、ストリームのskip(long)
メソッドを使用して不要な行をスキップしてからスキャンを開始できます。
javadocで詳細を読むInputStream
おそらく、代わりにRandomAccessFileを使用する必要があります。