正确地在while循环中使用BufferedReader.readLine()

bil*_*118 19 java bufferedreader

所以我在将一个文本文件读入我的程序时遇到了问题.这是代码:

     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");
    }
Run Code Online (Sandbox Code Playgroud)

我正在读取的文件是100行参数.如果我使用for循环它完美地工作.如果我使用while语句(for循环上面注释掉的那个),它会在50处停止.用户可能会运行带有任意行数的文件的程序,因此我当前的for循环实现赢了工作.

为什么线路while(br.readLine()!=null)停在50?我检查了文本文件,没有任何东西可以挂起来.

当我使用while循环时,我没有从try-catch中得到任何错误,所以我很难过.有人有主意吗?

ram*_*min 37

也非常全面......

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");
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我要走的路。`while((line=br.readLine())!=null)` 太丑了。我不喜欢调用 br.readLine() 两次,但对此你无能为力。我只是将“for”语句缩短为“for (String s = br.readLine(); s != null; s = br.readLine())” (2认同)
  • 我喜欢 for 循环语法,因此循环后没有变量。它也可以缩短一点,仍然有点难看:`for ( String line = null; null != (line = reader.readLine()); )` **注意:** 使用 `reader.readLine()`在条件和 `for` 的初始值设定项中导致跳过第一行。 (2认同)

SLa*_*aks 26

你在br.readLine()循环中第二次打电话.
因此,每次你四处走动时,你最终会读行.

  • Java中允许使用`((line = br.readLine())!= null)`语法,对吧? (6认同)
  • @jpm:是的; 这是最好的方法.(虽然我喜欢首先使用`null`来使其更清晰) (3认同)

Mon*_*lal 11

您可以使用如下结构:

 while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
Run Code Online (Sandbox Code Playgroud)


ram*_*min 9

以防万一您仍然在这个问题上绊脚石。如今,使用Java 8看起来更好:

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


bil*_*118 5

感谢 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");
    }
Run Code Online (Sandbox Code Playgroud)

再次感谢!你们太棒了!