21

BufferedReaderinオブジェクトが何か読むものであるかどうかを確認する方法はありますか?C++のようなものcin.peek()。ありがとう。

4

8 に答える 8

39

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
于 2010-03-25T17:05:53.930 に答える
19

「booleanready()」メソッドを試すことができます。Java 6 APIドキュメントから:「バッファが空でない場合、または基になる文字ストリームの準備ができている場合、バッファリングされた文字ストリームの準備ができています。」

BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
   r.read();
}
于 2010-03-25T17:03:49.703 に答える
14

次のコードは、ストリームの最初のバイトを調べます。あなたのためのピークとして機能する必要があります。

BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();
于 2010-03-25T17:03:29.600 に答える
4

BufferedReader#readLine()通常のイディオムは、が返されない場合にループをチェックインすることnullです。ストリームの終わりに達すると(たとえば、ファイルの終わり、ソケットが閉じているなど)、。を返しますnull

例えば

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

行を読みたくない場合(これがaBufferedReaderが選択された主な理由です)、BufferedReader#ready()代わりに次を使用します。

BufferedReader reader = new BufferedReader(someReaderSource);
while (reader.ready()) {
    int data = reader.read();
    // ...
}
于 2010-03-25T17:06:18.890 に答える
2
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();
于 2010-03-25T17:03:42.283 に答える
1

を使用しPushBackReaderて文字を読み取り、「押し戻す」ことができます。そうすれば、全体的な状態に影響を与えることなく、何かがそこにあったことを確実に知ることができます-「ピーク」。

于 2010-03-25T17:06:45.110 に答える
1

pgmuraからの答え(ready()メソッドに依存)は単純で機能します。ただし、これはSunによるメソッドの実装によるものであることを忘れないでください。これは実際にはドキュメントと一致しません。この振る舞いが重要である場合、私はそれに依存しません。ここを参照してくださいhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 私はむしろPushbackReaderオプションを使用したいと思います。

于 2010-03-25T19:16:50.113 に答える
1

私の解決策は..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;
        }
    }
}
于 2016-01-05T06:21:22.687 に答える