هل يمكنني إلقاء نظرة خاطفة على قائد المخزن المؤقت؟

StackOverflow https://stackoverflow.com/questions/2517638

  •  22-09-2019
  •  | 
  •  

سؤال

هل هناك طريقة للتحقق من الوصول BufferedReader الكائن شيء للقراءة؟ شيء مثل C ++ cin.peek(). شكرًا.

هل كانت مفيدة؟

المحلول

يمكنك تجربة طريقة "Boolean Ready ()". من مستند Java 6 API: "دفق حرف مخزن مؤقت جاهز إذا لم يكن المخزن المؤقت فارغًا ، أو إذا كان دفق الأحرف الأساسي جاهزًا."

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

نصائح أخرى

يمكنك استخدام أ باكريدريد. باستخدام ذلك يمكنك قراءة حرف ، ثم لا تقرأه. هذا يتيح لك أساسا دفعه للخلف.

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

سوف ينظر الرمز التالي إلى البايت الأول في الدفق. يجب أن يكون بمثابة نظرة خاطفة لك.

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();

يمكنك استخدام أ PushBackReader لقراءة شخصية ، ثم "ادفعها للخلف". وبهذه الطريقة تعرف على وجه اليقين أن هناك شيئًا ما ، دون التأثير على حالته العامة - "نظرة خاطفة".

الجواب من pgmura (الاعتماد على جاهز() الطريقة) بسيطة ويعمل. لكن ضع في اعتبارك أن ذلك بسبب تنفيذ Sun للطريقة ؛ الذي لا يتفق حقا مع الوثائق. لن أعتمد على ذلك ، إذا كان هذا السلوك أمرًا بالغ الأهمية. انظر هنا http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=4090471أفضل الذهاب مع خيار BappbackReader.

كان الحل الخاص بي .. تمديد 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;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top