2012-05-06 32 views
1

我有一個方法,讀取txt文件中的下一行並執行一些操作。我還有另一種需要檢查EOF的方法。這兩種方法在循環中被接受地調用。如何檢查沒有readLine()的EOF?

方法1:

trace = br.readLine(); 
    if (trace==null) 
     break; // end of file 

方法2: 我需要檢查EOF而不使用相同的技術。否則,它會增加用於readLine的ptr ...

有沒有什麼辦法可以做到這一點?

感謝

+0

檢查這個問題:http://stackoverflow.com/questions/2517638/can-i-peek-on-a-bufferedreader和這樣的回答:http://stackoverflow.com/a/2517713/1227804 – user1227804

回答

0

您可以使用

Scanner sc = new Scanner (file); 

和閱讀

while (sc.hasNext()) 

掃描程序具有

sc.readLine(); 

方法。

+0

這個通用答案並沒有開始解決OP在代碼中兩處檢查EOF的具體請求。 –

+0

@MarkoTopolnik:錯! '如果此掃描器在其輸入中有另一個標記,則返回true。此方法可能會在等待輸入進行掃描時阻塞。掃描儀不會超過任何輸入.'您可以在不同的點調用該方法。 –

1

有沒有辦法做到這一點?

BufferedReader API不允許你這樣做(*)。如果你真的需要這樣做,你需要實現一個自定義的Reader類來做到這一點。我會從PushbackReader開始,添加一個readLine()方法,然後通過讀取一個字符並將其推回來實現eof測試方法。

*從閱讀對Can I peek on a BufferedReader?的回答可知,ready()方法可能用作EOF測試。但是,這是標準代碼庫中ready()當前實現的一個僞造,根據該方法的javadoc規範可以說是錯誤的(一個bug)。

+0

嗯......謝謝! –

0

您也可以使用此格式來檢查以避免EOF異常。由於緩衝區大小是早期確定的,它不會導致任何錯誤發生。

File myFile = new File("path"); 
String completeText = ""; 
FileChannel fc = new FileInputStream(myFile.getAbsoluteFile()).getChannel(); 
ByteBuffer buffer = ByteBuffer.allocate((int)fc.size()); 
fc.read(buffer); 
Charset charset = Charset.defaultCharset(); 
CharsetDecoder decoder = charset.newDecoder(); 
CharBuffer charBuffer = decoder.decode(buffer);  
completeText = charBuffer.toString(); 
buffer.clear(); 
fc.close();