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?
cevap
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();
}
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();
Ama işareti değere dönmez, bu yüzden gerçekten kontrol edemiyorum? –
Ama sonra bir göz atmak istemiyorsan, bir değer vermek ister misin? –
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. –
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
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
İyi cevap! Bu Java "peek". – Pindatjuh
Ayrıca bakınız: http://stackoverflow.com/a/9198381/59087 –
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();
// ...
}
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
Cevap basit ve çalışır. Ancak bunun Güneş'in yöntemin uygulanmasından kaynaklandığını unutmayın; Bu belgelere gerçekten katılıyorum. Bu davranış kritikse buna güvenmeyeceğim. Bakın http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 PushbackReader seçeneğiyle gitmeyi tercih ederim.
Çö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;
}
}
}
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