BufferedReader
inオブジェクトが何か読むものであるかどうかを確認する方法はありますか?C++のようなものcin.peek()
。ありがとう。
8 に答える
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
「booleanready()」メソッドを試すことができます。Java 6 APIドキュメントから:「バッファが空でない場合、または基になる文字ストリームの準備ができている場合、バッファリングされた文字ストリームの準備ができています。」
BufferedReader r = new BufferedReader(reader);
if(r.ready())
{
r.read();
}
次のコードは、ストリームの最初のバイトを調べます。あなたのためのピークとして機能する必要があります。
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) {
// ...
}
行を読みたくない場合(これがaBufferedReader
が選択された主な理由です)、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();
を使用しPushBackReader
て文字を読み取り、「押し戻す」ことができます。そうすれば、全体的な状態に影響を与えることなく、何かがそこにあったことを確実に知ることができます-「ピーク」。
pgmuraからの答え(ready()メソッドに依存)は単純で機能します。ただし、これはSunによるメソッドの実装によるものであることを忘れないでください。これは実際にはドキュメントと一致しません。この振る舞いが重要である場合、私はそれに依存しません。ここを参照してくださいhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 私はむしろPushbackReaderオプションを使用したいと思います。
私の解決策は..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;
}
}
}