5

非常に大きなテキスト ファイルがあり、最後の近くのどこかからデータを収集する必要があります。おそらく、スキャナーはこれを行うための最良の方法ではありませんが、ファイルの目的の部分に到達する前に、先頭から開始して6000行を取得するのは非常に無駄です。スキャナーにジャンプするように指示する方法はありますかドキュメントの 7/8 と言うか、下から始めて上にスキャンして行ごとにつかみますか?

ありがとう

4

3 に答える 3

5

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
于 2010-06-17T18:27:23.863 に答える
2

ScannerをラップするInputStreamと、ストリームのskip(long) メソッドを使用して不要な行をスキップしてからスキャンを開始できます。

javadocで詳細を読むInputStream

于 2010-06-17T18:23:46.680 に答える
2

おそらく、代わりにRandomAccessFileを使用する必要があります。

于 2010-06-17T18:25:29.187 に答える