2010-09-15 44 views
8

我的代碼需要讀取所有文件。目前我使用下面的代碼:如何查看閱讀器是否在EOF?

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

如果該文件是當前爲空,雖然,然後s爲空,這是沒有好處的。有沒有Reader有一個atEOF()方法或等效?

回答

1

爲你正在嘗試做一個標準的模式是:

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

就緒()方法只告訴下一個讀是否會阻止。如果讀者在eof下一次通話不會阻止;它將立即返回EOF指示(readline爲空,-1爲讀取)。 – 2010-09-15 11:30:11

+1

甚至更​​好:做,而不是while。 – 2010-09-18 15:47:48

+0

'BufferedReader.readLine()'的JavaDoc表示它返回「一個包含該行內容的字符串...或者空**如果流已到達**」 – Raedwald 2013-11-01 15:42:41

0

就緒()方法將不起作用。您必須從流中讀取並檢查返回值以查看您是否在EOF。

+0

嗯,在許多情況下,它*會*起作用,但它不會做什麼來回答這個問題。 – EJP 2016-04-20 10:15:02

3

docs說:

public int read() throws IOException
返回: 讀取的字符,如在範圍內的整數0到65535(0x00-0xffff),或-1,如果流的端部具有已達到。

所以在閱讀器的情況下,應該覈對EOF像

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

在一個BufferedReader和readline()的情況下,它可能是

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

因爲的readLine()在EOF上返回null。

0

使用此功能:

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

*當且僅當* Reader'支持'mark()'和'reset()'。 – EJP 2016-04-20 10:14:25