Using BufferedReader.readLine() in a while loop pr

2019-01-06 18:13发布

So I'm having an issue reading a text file into my program. Here is the code:

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

The file I am reading from is 100 lines of arguments. If I use a for loop it works perfectly. If I use the while statement (the one commented out above the for loop) it stops at 50. There is a possibility that a user can run the program with a file that has any number of lines, so my current for loop implementation won't work.

Why does the line while(br.readLine()!=null) stop at 50? I checked the text file and there is nothing that would hang it up.

I don't get any errors from the try-catch when I use the while loop so I am stumped. Anyone have any ideas?

6条回答
神经病院院长
2楼-- · 2019-01-06 18:40

also very comprehensive...

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楼-- · 2019-01-06 18:41
Concept Solution:br.read() returns particular character's int value so loop 
continue's until we won't get -1 as int value and Hence up to there it print 
br.eadline() which returns a line into String form.
Way 1:
while(br.read()!=-1)
 {
  //continues loop until we won't get int value as a -1
  System.out.println(br.readLine());
 }
 Way 2:
 while((line=br.readLine())!=null)
 {
  System.out.println(line);
 }
 Way 3:
 for(String line=br.readLine();line!=null;line=br.readLine())
 {
  System.out.println(line);
 }``
 Way 4:
 It's an advance way to read file using collection and arrays concept 
 How we iterate using for each loop.

check it here http://www.java67.com/2016/01/how-to-use-foreach-method-in-java-8-examples.html

查看更多
可以哭但决不认输i
4楼-- · 2019-01-06 18:49

Thank you to SLaks and jpm for their help. It was a pretty simple error that I simply did not see.

As SLaks pointed out, br.readLine() was being called twice each loop which made the program only get half of the values. Here is the fixed code:

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

Thanks again! You guys are great!

查看更多
霸刀☆藐视天下
5楼-- · 2019-01-06 18:50

In case if you are still stumbling over this question. Nowadays things look nicer with Java 8:

try {
  Files.lines(Paths.get(targetsFile)).forEach(
    s -> {
      System.out.println(s);
      // do more stuff with s
    }
  );
} catch (IOException exc) {
  exc.printStackTrace();
}
查看更多
趁早两清
6楼-- · 2019-01-06 18:53

You're calling br.readLine() a second time inside the loop.
Therefore, you end up reading two lines each time you go around.

查看更多
我想做一个坏孩纸
7楼-- · 2019-01-06 18:54

You can use a structure like the following:

 while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
查看更多
登录 后发表回答