25

そのため、テキスト ファイルをプログラムに読み込む際に問題が発生しています。コードは次のとおりです。

try {
    InputStream fis = new FileInputStream(targetsFile);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));

    //while(br.readLine()!=null){
    for (int i = 0; i < 100; i++) {
        String[] words = br.readLine().split(" ");
        int targetX = Integer.parseInt(words[0]);
        int targetY = Integer.parseInt(words[1]);
        int targetW = Integer.parseInt(words[2]);
        int targetH = Integer.parseInt(words[3]);
        int targetHits = Integer.parseInt(words[4]);
        Target a = new Target(targetX, targetY, targetW, targetH, targetHits);
        targets.add(a);
    }
    br.close();
} catch (Exception e) {
    System.err.println("Error: Target File Cannot Be Read");
}

私が読んでいるファイルは100行の引数です。for ループを使用すると、完全に機能します。while ステートメント (for ループの上でコメントアウトされたもの) を使用すると、50 で停止します。ユーザーが任意の行数のファイルを使用してプログラムを実行できる可能性があるため、現在の for ループの実装は失敗します。動作しません。

while(br.readLine()!=null)ラインが 50 で止まるのはなぜですか? テキスト ファイルを確認しましたが、ハングアップするものはありません。

while ループを使用すると、try-catch からエラーが発生しないため、困惑しています。誰にもアイデアはありますか?

4

7 に答える 7

44

また、非常に包括的な...

try{
    InputStream fis=new FileInputStream(targetsFile);
    BufferedReader br=new BufferedReader(new InputStreamReader(fis));

    for (String line = br.readLine(); line != null; line = br.readLine()) {
       System.out.println(line);
    }

    br.close();
}
catch(Exception e){
    System.err.println("Error: Target File Cannot Be Read");
}
于 2014-02-11T15:33:56.853 に答える
31

br.readLine()ループ内でもう一度呼び出しています。
したがって、一周するたびに2行を読むことになります。

于 2012-11-15T20:41:57.173 に答える
16

次のような構造を使用できます。

 while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
于 2016-03-27T04:33:42.530 に答える
5

SLaks と jpm の協力に感謝します。それは私が見たことのない非常に単純なエラーでした。

SLaks が指摘したように、各ループで br.readLine() が 2 回呼び出されたため、プログラムは値の半分しか取得できませんでした。固定コードは次のとおりです。

try{
        InputStream fis=new FileInputStream(targetsFile);
        BufferedReader br=new BufferedReader(new InputStreamReader(fis));
        String words[]=new String[5];
        String line=null;
        while((line=br.readLine())!=null){
            words=line.split(" ");
            int targetX=Integer.parseInt(words[0]);
            int targetY=Integer.parseInt(words[1]);
            int targetW=Integer.parseInt(words[2]);
            int targetH=Integer.parseInt(words[3]);
            int targetHits=Integer.parseInt(words[4]);
            Target a=new Target(targetX, targetY, targetW, targetH, targetHits);
            targets.add(a);
        }
        br.close();
    }
    catch(Exception e){
        System.err.println("Error: Target File Cannot Be Read");
    }

再度、感謝します!あなたたちは素晴らしいです!

于 2012-11-15T20:55:36.017 に答える
3

@ramin の回答に加えて、すでにBufferedReaderorがある場合は、次InputStreamのような行を繰り返すことができます。

reader.lines().forEach(line -> {
    //...
});

または、指定された順序で処理する必要がある場合:

reader.lines().forEachOrdered(line -> {
    //...
});
于 2019-04-24T14:26:29.380 に答える