Могу ли я посмотреть на BufferedReader? - PullRequest
18 голосов
/ 25 марта 2010

Есть ли способ проверить, есть ли в BufferedReader объект что-нибудь для чтения? Что-то вроде C ++ cin.peek(). Спасибо.

Ответы [ 8 ]

33 голосов
/ 25 марта 2010

Вы можете использовать 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
14 голосов
/ 25 марта 2010

Вы можете попробовать метод "boolean ready ()". Из документа API Java 6: «Буферизованный символьный поток готов, если буфер не пуст или если базовый символьный поток готов.»

BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
   r.read();
}
12 голосов
/ 25 марта 2010

Следующий код будет смотреть на первый байт в потоке. Должен выступать в качестве приглядывания за вами.

BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();
4 голосов
/ 25 марта 2010

Обычная идиома - проверять в цикле, если BufferedReader#readLine() не возвращает null. Если достигнут конец потока (например, конец файла, сокет закрыт и т. Д.), Он возвращает null.

1008 * Е.Г. *

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();
    // ...
}
2 голосов
/ 25 марта 2010
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
1 голос
/ 25 марта 2010

Ответ от pgmura (опираясь на метод ready ()) прост и работает. Но имейте в виду, что это потому, что Sun реализует этот метод; который не совсем согласен с документацией. Я бы не стал полагаться на это, если бы такое поведение было критическим. Смотри здесь http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 Я бы лучше выбрал опцию PushbackReader.

1 голос
/ 25 марта 2010

Вы можете использовать PushBackReader, чтобы прочитать символ, а затем «нажать его назад». Таким образом, вы точно знаете, что что-то было там, не влияя на его общее состояние - «взгляд».

0 голосов
/ 05 января 2016

Мое решение было .. расширение 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;
        }
    }
}
...