質問

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

役に立ちましたか?

解決

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

BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
   r.read();
}

他のヒント

あなたは 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

次のコードは、ストリームの最初のバイトを見ていきます。あなたのためのPEEKとして行動しなければならない。

BufferedReader bReader = new BufferedReader(inputStream);
bReader.mark(1);
int byte1 = bReader.read();
bReader.reset();

通常のイディオムは、ループでチェックすることです。 BufferedReader#readLine() 戻らない null. 。ストリームの終わりに達した場合 (例:ファイルの終わり、ソケットが閉じられたなど)、その後、戻ります null.

例えば。

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();
    // ...
}
BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();

あなたはA PushBackReader に使用することができます文字を読み、その後、「戻ってそれをプッシュ」します。あなたは何かがその全体的な状態に影響を与えずに、そこにあったことを確実に知るその方法 - 。「PEEK」

の準備の()メソッドに依存する)pgmuraからの答えは簡単で、作品です。 しかし、それはメソッドのSunの実装ためだということを念頭に置いてクマ。これは実際に文書に同意しません。この動作が重要である場合、私は、それに依存しないでしょう。 ここ http://bugs.sun.com/bugdatabase/view_bug.doを参照してください? bug_id = 4090471こちら 私はむしろPushbackReaderオプションを指定して行くと思います。

私の解決策は、あなたがキューにPEEK方法を使用することができ、BUFとしてBufferedReaderのと使用キューを拡張...だっます。

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;
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top