Использование BufferedReader.readLine() в цикле while

Итак, у меня возникла проблема с чтением текстового файла в моей программе. Вот код:

     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. Существует вероятность, что пользователь может запустить программу с файлом, который имеет любое количество строк, поэтому моя текущая реализация цикла завершилась ' т работы.

Почему линия while(br.readLine()!=null) останавливается на 50? Я проверил текстовый файл, и нет ничего, что могло бы повесить его.

Я не получаю никаких ошибок из try-catch, когда я использую цикл while, поэтому я в тупике. У кого-нибудь есть идеи?

Ответ 1

Вы вызываете br.readLine() второй раз в цикле.
Поэтому вы заканчиваете чтение двух строк каждый раз, когда вы идете вокруг.

Ответ 2

также очень всеобъемлющий...

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");
}

Ответ 3

Вы можете использовать следующую структуру:

 while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

Ответ 4

Спасибо SLaks и jpm за помощь. Это была довольно простая ошибка, которую я просто не видел.

Как указывал SLaks, команда br.readLine() вызывалась дважды в каждом цикле, что заставляло программу получать только половину значений. Вот фиксированный код:

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");
    }

Еще раз спасибо! Вы, ребята, великолепны!

Ответ 5

Если вы все еще спотыкаетесь над этим вопросом. В настоящее время все выглядит лучше с Java 8:

try {
  Files.lines(Paths.get(targetsFile)).forEach(
    s -> {
      System.out.println(s);
      // do more stuff with s
    }
  );
} catch (IOException exc) {
  exc.printStackTrace();
}