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()循环内第二次调用。因此,您每次四处走动时
最终都会阅读两行。

于 2012-11-15T20:41:57.173 回答
16

您可以使用如下结构:

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

如果您仍然在这个问题上绊倒。如今,Java 8 看起来更好:

try {
  Files.lines(Paths.get(targetsFile)).forEach(
    s -> {
      System.out.println(s);
      // do more stuff with s
    }
  );
} catch (IOException exc) {
  exc.printStackTrace();
}
于 2017-12-01T20:26:23.027 回答
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");
    }

再次感谢!你们太棒了!

于 2012-11-15T20:55:36.017 回答
3

概念解决方案:br.read() 返回特定字符的 int 值,因此循环继续,直到我们不会得到 -1 作为 int 值,因此到那里它打印 br.readLine(),它将一行返回为 String 形式。

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

方式4:这是一种使用集合和数组概念读取文件的高级方式我们如何使用for每个循环进行迭代。在这里查看 http://www.java67.com/2016/01/how-to-use-foreach-method-in-java-8-examples.html

于 2018-04-14T07:23:28.670 回答
3

除了@ramin 给出的答案之外,如果您已经拥有BufferedReaderor InputStream,则可以遍历如下行:

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

或者如果您需要按照给定的顺序处理它:

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