有沒有辦法檢查BufferedReader
對象是否有東西可讀?類似於C++ cin.peek()
。謝謝。我可以偷看BufferedReader嗎?
回答
你可以試試 「布爾就緒()」 方法。 從Java 6 API doc:「如果緩衝區不是空的,或者底層字符流已準備好,緩衝字符流就緒。」
BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
r.read();
}
以下代碼將查看Stream中的第一個字節。應該爲你偷看。
BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();
但標記不返回值,所以我不能檢查真的嗎? – 2010-03-25 17:06:05
但是你不想偷看,你想要返回一個值? – 2010-03-25 17:06:44
是的,我想要一個int peek()。如果流中有東西,我會通過檢查返回值來得到答案,但流的狀態不會改變。 – 2010-03-26 09:09:08
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
您可以使用PushbackReader。使用它你可以讀取一個字符,然後再讀取它。這基本上可以讓你推回來。
PushbackReader pr = new PushbackReader(reader);
char c = (char)pr.read();
// do something to look at c
pr.unread((int)c); //pushes the character back into the buffer
很好的答案!這是Java的「偷看」。 – Pindatjuh 2010-03-25 17:17:21
另請參閱:http://stackoverflow.com/a/9198381/59087 – 2014-08-11 19:23:28
正常的成語是在一個循環中,以檢查是否BufferedReader#readLine()
不返回null
。如果到達尾流(例如文件結束,套接字關閉等),則它返回null
。
E.g.
BufferedReader reader = new BufferedReader(someReaderSource);
String line = null;
while ((line = reader.readLine()) != null) {
// ...
}
如果你不想線讀取(這是由方式已經選擇了BufferedReader
的主要原因),然後使用BufferedReader#ready()
代替:
BufferedReader reader = new BufferedReader(someReaderSource);
while (reader.ready()) {
int data = reader.read();
// ...
}
你可以使用一個PushBackReader
閱讀一個角色,然後「推回」。這樣,你肯定知道那裏有東西,而不會影響它的整體狀態 - 「偷看」。
pgmura的答案(依靠準備好()方法)很簡單,很有效。但請記住,這是因爲Sun執行該方法;這與文檔並不完全一致。如果這種行爲至關重要,我不會依賴這一點。 請看這裏http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 我寧願去使用PushbackReader選項。
我的解決方案是..擴展BufferedReader並使用隊列作爲buf,那麼你可以在隊列中使用peek方法。
public class PeekBufferedReader extends BufferedReader{
private Queue<String> buf;
private int bufSize;
public PeekBufferedReader(Reader reader, int bufSize) throws IOException {
super(reader);
this.bufSize = bufSize;
buf = Queues.newArrayBlockingQueue(bufSize);
}
/**
* readAheadLimit is set to 1048576. Line which has length over readAheadLimit
* will cause IOException.
* @throws IOException
**/
//public String peekLine() throws IOException {
// super.mark(1048576);
// String peekedLine = super.readLine();
// super.reset();
// return peekedLine;
//}
/**
* This method can be implemented by mark and reset methods. But performance of
* this implementation is better (about 2times) than using mark and reset
**/
public String peekLine() throws IOException {
if (buf.isEmpty()) {
while (buf.size() < bufSize) {
String readLine = super.readLine();
if (readLine == null) {
break;
} else {
buf.add(readLine);
}
}
} else {
return buf.peek();
}
if (buf.isEmpty()) {
return null;
} else {
return buf.peek();
}
}
public String readLine() throws IOException {
if (buf.isEmpty()) {
while (buf.size() < bufSize) {
String readLine = super.readLine();
if (readLine == null) {
break;
} else {
buf.add(readLine);
}
}
} else {
return buf.poll();
}
if (buf.isEmpty()) {
return null;
} else {
return buf.poll();
}
}
public boolean isEmpty() throws IOException {
if (buf.isEmpty()) {
while (buf.size() < bufSize) {
String readLine = super.readLine();
if (readLine == null) {
break;
} else {
buf.add(readLine);
}
}
} else {
return false;
}
if (buf.isEmpty()) {
return true;
} else {
return false;
}
}
}
- 1. 如何偷看可選項?
- 2. 我可以在前端看看嗎?
- 3. StreamReader,C#,偷看
- 4. python2.7偷看stdin
- 5. 有人在偷我嗎?
- 6. 偷看我的代碼幫我
- 7. 偷看下一行
- 8. 我可以查看視圖嗎?
- 9. 我的僱主可以查看我看到的表格嗎?
- 10. 你可以偷偷「插入」到「選擇」語句?
- 11. Azure「偷看」整個隊列?
- 12. 在計劃中偷看?
- 13. 在python中偷看堆
- 14. webkit translate3d問題(偷看)
- 15. 我可以看看訪問特定地址的內容嗎?
- 16. 我可以看看沒有線程在等待信號量嗎?
- 17. 有人可以看看我的花括號嗎?
- 18. 有人可以看看我的rakefile的語法嗎?
- 19. 有人可以看看我的html5和css3嗎?
- 20. 有人可以讓我看看Paypal IPN的「hello world」嗎?
- 21. 我可以問ANT看看外部罐子的.classpath嗎?
- 22. 我可以使用BufferedReader並在actionListener類中創建一個數組嗎?
- 23. 可以通過BufferedReader在線讀取文本文件嗎?
- 24. 我可以查看cin緩衝區以進行調試嗎?
- 25. 我可以阻止他人看到我的Python代碼嗎?
- 26. 我可以阻止某人看到我的JavaScript嗎?
- 27. 我的鄰居可以看到我的http流量嗎?
- 28. 我可以使用ACTION_VIEW查看我已下載的JPG嗎?
- 29. 我的PC上可以看到我的Greasemonkey腳本嗎?
- 30. 當我使用--watch時,我可以關閉Mocha的觀看觀看行爲嗎?
我有這樣的感覺,在C++的窺視和Java的窺視中存在歧義。 「檢查是否有東西要讀」與Java中的「peek」不匹配。 – BalusC 2010-03-25 17:09:39