2010-09-15 21 views
8

Mã của tôi cần đọc trong tất cả tệp. Hiện tại tôi đang sử dụng mã sau:Làm thế nào để xem một Reader có ở EOF không?

BufferedReader r = new BufferedReader(new FileReader(myFile)); 
while (r.ready()) { 
    String s = r.readLine(); 
    // do something with s 
} 
r.close(); 

Nếu tệp hiện tại trống, thì s là không có giá trị, không tốt. Có bất kỳ Reader nào có phương thức atEOF() hoặc tương đương không?

Trả lời

1

Một mô hình tiêu chuẩn cho những gì bạn đang cố gắng làm là:

BufferedReader r = new BufferedReader(new FileReader(myFile)); 
String s = r.readLine(); 
while (s != null) { 
    // do something with s 
    s = r.readLine(); 
} 
r.close(); 
+4

Phương pháp sẵn sàng() chỉ nói cho dù đọc tiếp theo sẽ chặn. Nếu Reader đang ở thời điểm cuộc gọi tiếp theo sẽ không chặn; nó sẽ trở lại ngay lập tức với một dấu hiệu EOF (null cho readline, -1 để đọc). –

+1

Thậm chí tốt hơn: làm trong khi thay vì trong khi. –

+0

JavaDoc của 'BufferedReader.readLine()' nói nó trả về "Chuỗi chứa nội dung của dòng ... hoặc null ** nếu kết thúc luồng đã đạt **" – Raedwald

0

phương pháp sẵn sàng() sẽ không hoạt động. Bạn phải đọc từ luồng và kiểm tra giá trị trả về để xem liệu bạn có đang ở EOF hay không.

+0

Vâng, nó * sẽ * hoạt động, trong nhiều trường hợp, nhưng nó sẽ không làm những gì được yêu cầu để trả lời câu hỏi này. – EJP

3

Các docs nói:

public int read() throws IOException
Returns: Nhân vật đọc, như một số nguyên trong khoảng 0-65.535 (0x00-0xffff), hoặc -1 nếu cuối dòng có đạt được.

Vì vậy, trong trường hợp của một Reader ta nên kiểm tra chống lại EOF như

// Reader r = ...; 
int c; 
while (-1 != (c=r.read()) { 
    // use c 
} 

Trong trường hợp của một BufferedReader và readLine(), nó có thể là

String s; 
while (null != (s=br.readLine())) { 
    // use s 
} 

vì readLine() trả về null trên EOF.

0

Sử dụng chức năng này:

public static boolean eof(Reader r) throws IOException { 
    r.mark(1); 
    int i = r.read(); 
    r.reset(); 
    return i < 0; 
} 
+0

* Nếu và chỉ khi * 'Reader' hỗ trợ' mark() 'và' reset() '. – EJP

Các vấn đề liên quan