14

私はJavaに関しては素人なので、私の質問がばかげていると思われる場合はご容赦ください:-Pファイル内の行数をカウントするように設計された次のコードがあります:

while (scanNumOfLines.hasNextLine())    
    {
    NumOfLines ++;
    scanNumOfLines.nextLine();
    }
    System.out.println("NumOfLines = "+NumOfLines);

カウントは問題ありませんが、別の目的でスキャナーを再利用したいのですが、 nextLine がファイルの最後の行に移動したため、最初の行にリセットしたいと考えています。

(代わりに、別の目的で別のスキャナーを使用する必要がありましたが、これは本来あるべきよりもエレガントではないように思えます。)

カウンターをゼロにリセットするスキャナーメソッドが必要だと思いますか?

ありがとう

CJ

4

5 に答える 5

15

これは不可能です。

それを含めない理由は、それがサポートする幅広い入力タイプです。その一例がストリームです。これらは、渡された後に結果を保存しないため、リセットをサポートしていません。

したがって、エレガントな方法は、新しい を作成することScannerです。多くのカスタム設定を指定する場合は、ファクトリ メソッドを作成します。

于 2012-12-21T14:01:59.347 に答える
8

を再宣言する必要がありScannerます。を呼び出すnextLine()と、行はバッファから削除され、実質的に から破棄されますScanner

したがって、本質的に、それ行う方法があります。それはコンストラクターです。

Scanner scanNumOfLines = new Scanner(myFile);

Scannerオブジェクトに「カウンター」はありません。代わりに、コンベヤー ベルトのようなものと考えてください。ベルトには、その上にあるものについての知識も関心もありません。アイテムが残っている間、それはあなたに物を吐き出し続けます。そして、あなたがそれらを取ると、それらは永遠にそこから消えます.

于 2012-12-21T14:00:15.720 に答える
1

私はこれがすでに答えられていることを認識していますが、私がこのものを調べているなら、他の誰かもそうしていると確信しているので、私はこの問題を解決するために行った方法に貢献すると思いました:ユーザー入力に基づいて何度も、私のテストクラスには、ファイルを読み取り、不要になったら自分自身を削除するスキャナーの ArrayList があります。私が設定した方法では、ArrayList に複数のスキャナーが存在することはありませんが、ArrayList はオブジェクトの追加と削除に役立ちます。

public class TxtReader {
     private boolean PROGRAM_CONTINUES = true;
     private final int indexCount = 0;
     File newFile = new File("Reader Example.txt");
     ArrayList<Scanner> scanList = new ArrayList<Scanner>();

     public TxtReader(Scanner UserInput) throws FileNotFoundException {
         while(PROGRAM_CONTINUES) {
              if (UserInput.next().equalsIgnoreCase("end")) { 
          // some arbitrary way of concluding the while loop
                  PROGRAM_CONTINUES = false;
                  break;
              }
              scanList.add(new Scanner(newFile));
          // DO STUFF*********************************************
              while(scanList.get(indexCount).hasNext()) {
                 System.out.println(scanList.get(indexCount).nextLine());
             }
          //******************************************************
              scanList.get(indexCount).close(); 
          //always close a scanner after you're done using it
              scanList.remove(indexCount); // removes the now-unnecessary scanner 
              UserInput = new Scanner(System.in);
        }
    }
    public static void main(String[] args) throws FileNotFoundException {
        new TxtReader(new Scanner(System.in));
    }
}
于 2015-11-16T20:05:57.710 に答える
-1

RandomAccessFileを使用し、seek()メソッドを使用して最初の行に戻ることができます。

于 2012-12-21T14:00:54.373 に答える