簡體   English   中英

在 while 循環中正確使用 BufferedReader.readLine()

[英]Using BufferedReader.readLine() in a while loop properly

所以我在將文本文件讀入我的程序時遇到了問題。 這是代碼:

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 中得到任何錯誤,所以我被難住了。 誰有想法?

也很全面...

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

您在循環內第二次調用br.readLine()
因此,您每次四處走動時最終都會閱讀行。

您可以使用如下結構:

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

以防萬一你還在這個問題上磕磕絆絆。 現在 Java 8 看起來更好了:

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

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

再次感謝! 你們太棒了!

概念解決方案: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

除了@ramin 給出的答案之外,如果您已經有BufferedReaderInputStream ,則可以遍歷這樣的行:

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

或者如果您需要按照給定的順序處理它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM