簡體   English   中英

使用 BufferedReader 讀取行並檢查文件結尾

[英]Reading lines with BufferedReader and checking for end of file

如果我的代碼中有這樣的東西:

String line = r.readLine();  //Where r is a bufferedReader

如果下一行是文件的結尾,如何避免崩潰? (即空)

我需要閱讀下一行,因為那里可能有我需要處理的事情,但如果沒有,代碼就會崩潰。

如果那里有東西,那么一切都很好,但我不能保證那里會有東西。

因此,如果我執行以下操作:(偽代碼):

if (r.readLine is null)
//End code

else {check line again and excecute code depending on what the next line is}

我遇到的問題是,當我根據空值檢查該行時,它已經移動到下一行,那么我該如何再次檢查呢?

我還沒有想出辦法來做到這一點 - 任何建議都會有很大幫助。

Am...你可以簡單地使用這樣的結構:

String line;

while ((line = r.readLine()) != null) {
   // do your stuff...
}

如果您想遍歷所有行,請使用:

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

您可以使用以下命令檢查文件的結尾。

public bool isEOF(BufferedReader br)  
{
     boolean result;

     try 
     {
         result = br.ready();
     } 
     catch (IOException e)
     {
         System.err.println(e);
     }
     return result;
}

在你的情況下,你可以閱讀下一行,因為那里可能有東西。如果沒有任何東西,你的代碼不會崩潰。

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

首先一個問題,你為什么不使用“函數式編程方法”? 無論如何,自Java 1.8以來添加了一個新方法lines() ,它讓BufferedReader將內容作為Stream返回。 它將文件中的所有行作為流獲取,然后您可以根據您的邏輯對字符串進行排序,然后將其收集在列表/集合中並寫入輸出文件。 如果您使用相同的方法,則無需擔心NullPointerException 以下是相同的代碼片段:-

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;

public class LineOperation {
    public static void main(String[] args) throws IOException {
            Files.newBufferedReader(Paths.get("C://xyz.txt")).
            lines().
            collect(Collectors.toSet()). // You can also use list or any other Collection
            forEach(System.out::println);
    }

}

您可以通過BufferReaderBufferReader 我知道這與以下問題無關。 但是我會為一個不會使用BufferReader而是使用Scanner來讀取文件的新手發布額外的事實。

BufferReader的一部分,您可以使用 Java Scanner類讀取文件並檢查最后一行。

緩沖區讀取器

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line
    }
}

掃描器

   try {
     Scanner scanner = new Scanner(new FileReader(file));
         while (scanner.hasNext()) {
            // Above checks whether it has or not ....
            }
       } catch (IOException e) {
            e.printStackTrace();
       }

如果您在多線程環境中使用此代碼片段,請繼續使用BufferReader因為它的synchronized

此外, BufferReaderScanner快。

你可以故意讓它在你的循環中拋出錯誤。 IE:

String s = "";
while (true) {
    try {
        s = r.readline();
    }catch(NullPointerException e) {
        r.close();
        break;
    }
    //Do stuff with line
}

其他人的悲傷也應該起作用。

暫無
暫無

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

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