Can I peek on a BufferedReader?

2019-02-08 01:58发布

Is there a way to check if in BufferedReader object is something to read? Something like C++ cin.peek(). Thanks.

8条回答
beautiful°
2楼-- · 2019-02-08 02:07
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
查看更多
Emotional °昔
3楼-- · 2019-02-08 02:12

You can try the "boolean ready()" method. From the Java 6 API doc: "A buffered character stream is ready if the buffer is not empty, or if the underlying character stream is ready."

BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
   r.read();
}
查看更多
乱世女痞
4楼-- · 2019-02-08 02:14

The answer from pgmura (relying on the ready() method) is simple and works. But bear in mind that it's because Sun's implementation of the method; which does not really agree with the documentation. I would not rely on that, if this behaviour is critical. See here http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 I'd rather go with the PushbackReader option.

查看更多
放我归山
5楼-- · 2019-02-08 02:16

The normal idiom is to check in a loop if BufferedReader#readLine() doesn't return null. If end of stream is reached (e.g. end of file, socket closed, etc), then it returns null.

E.g.

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

If you don't want to read in lines (which is by the way the major reason a BufferedReader is been chosen), then use BufferedReader#ready() instead:

BufferedReader reader = new BufferedReader(someReaderSource);
while (reader.ready()) {
    int data = reader.read();
    // ...
}
查看更多
【Aperson】
6楼-- · 2019-02-08 02:20

You can use a PushbackReader. Using that you can read a character, then unread it. This essentially allows you to push it back.

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
查看更多
兄弟一词,经得起流年.
7楼-- · 2019-02-08 02:22

The following code will look at the first byte in the Stream. Should act as a peek for you.

BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();
查看更多
登录 后发表回答