2010-03-25 21 views
17

BufferedReader nesnesinin okunacak bir şey olup olmadığını kontrol etmenin bir yolu var mı? C++ cin.peek() gibi bir şey. Teşekkürler.BufferedReader'a göz atabilir miyim?

+1

C++ 'in gözlüğünde ve Java'nın gözünde belirsizlik olduğunu hissediyorum. "Okumak için bir şey olup olmadığını kontrol et" Java'da "peek" ile eşleşmiyor. – BalusC

cevap

12

Sen "boolean hazır()" yöntemi deneyebilirsiniz. Java 6 API belgesinden: "Arabellek boş değilse veya temel karakter akışı hazırsa tamponlu bir karakter akışı hazırdır."

BufferedReader r = new BufferedReader(reader); 
if(r.ready()) 
{ 
    r.read(); 
} 
9

Aşağıdaki kod, Akıştaki ilk bayta bakacaktır. Senin için bir göz gibi davranmalı.

BufferedReader bReader = new BufferedReader(inputStream); 
bReader.mark(1); 
int byte1 = bReader.read(); 
bReader.reset(); 
+0

Ama işareti değere dönmez, bu yüzden gerçekten kontrol edemiyorum? –

+0

Ama sonra bir göz atmak istemiyorsan, bir değer vermek ister misin? –

+0

Evet int peek() istiyorum. Bir akışta bir şey varsa, dönüş değerini kontrol ederek buna cevabı alırım, ancak akışın durumu değişmeyecektir. –

2
BufferedReader br = new BufferedReader(reader); 
br.mark(1); 
int firstByte = br.read(); 
br.reset(); 
30

PushbackReader. Bunu kullanarak bir karakteri okuyabilir, sonra okunamazsınız. Bu aslında onu geri itmenizi sağlar.

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 
+2

İyi cevap! Bu Java "peek". – Pindatjuh

+1

Ayrıca bakınız: http://stackoverflow.com/a/9198381/59087 –

4

Normal deyim BufferedReader#readLine()null dönmez ise bir döngü içinde kontrol etmektir. Akışın sonuna ulaşılırsa (ör. Dosyanın sonu, soket kapalı, vb.), null değerini döndürür.

E.g.

BufferedReader reader = new BufferedReader(someReaderSource); 
String line = null; 
while ((line = reader.readLine()) != null) { 
    // ... 
} 

, sonra BufferedReader#ready() yerine kullanmak (a BufferedReader seçildi edilir başlıca nedeni bu arada olan) hatlarında okumak istemiyorsanız:

BufferedReader reader = new BufferedReader(someReaderSource); 
while (reader.ready()) { 
    int data = reader.read(); 
    // ... 
} 
1

Bir PushBackReader kullanabilirsiniz Bir karakteri okumak ve sonra "geri itin". Bu şekilde, bir şeyin, genel durumunu etkilemeksizin, bir "göz" olduğunu emin olarak biliyorsunuz. (hazır() yöntemine dayanarak) pgmura dan

0

Çözümüm, BufferedReader'ı genişletiyor ve sıra olarak buf kullanıyordu, sonra sıradaki peek yöntemini kullanabilirsiniz.

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; 
     } 
    } 
} 
İlgili konular