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;
}
}
}
- 1. Elmah hata kaydı, sadece mesaj atabilir miyim?
- 2. Kurucuya bağlı olarak bir değer atabilir miyim?
- 3. Genel .gitignore göz ardı edebilir miyim?
- 4. Çağrı atabilir, ancak hatalar küresel değişken başlatıcısı
- 5. Posta istemcisinde mesaj/teslim durumunu göz ardı edebilir miyim?
- 6. Console.Read göz ardı ediliyor
- 7. DebuggerStepBu göz ardı ediliyor
- 8. dropdown listesine göz atın
- 9. Oscar selfie'de göz taraması
- 10. Görünüm koleksiyonuna göz atabilirsiniz
- 11. Sekme tuşunu kullanarak gezinirken bazı web sitesi öğelerini göz ardı edebilir miyim?
- 12. Git altmodülü ile göz ardı edilecek bir dizin yapısı belirtebilir miyim?
- 13. Eclipse Helios, kesme noktalarını göz ardı eder
- 14. aşağıdaki java kod göz Double.MaxValue
- 15. JMeter'deki hataları göz ardı etme
- 16. Bir videoda göz gözü öğrencisi
- 17. iphone sdk göz kırpma algılama
- 18. .gitignore dizini göz ardı etmeyecek
- 19. Android - paint.setShadowLayer Gölge göz ardıColor
- 20. svn: xcuserdata göz ardı yoksayma
- 21. Automapper'ın durumu göz ardı edilir
- 22. Göz gezdirmeye gitmek için gitlab
- 23. Belirli bir şubeye göz atın?
- 24. JavaScript yanıp sönen göz animasyonu
- 25. Göz kırpma renkleri nasıl ayarlanır
- 26. Android stüdyosunda Android SDK kaynaklarına göz gezdirme 2.0
- 27. Python'da FIbbonaci spiraline nasıl daha çok göz atın?
- 28. Bir C++ uygulaması ayıklarken VCL (Pascal) koduna girebilir miyim?
- 29. Swift 2: Çağrı atabilir, ancak 'try' ile işaretlenmez ve hata işlenmez
- 30. Swift 2: Çağrı atabilir, ancak 'try' ile işaretlenmez ve hata işlenmez.
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