Vraag Kan ik een BufferedReader bekijken?


Is er een manier om te controleren of in BufferedReader object is iets om te lezen? Iets als C ++ cin.peek(). Bedankt.


18
2018-03-25 17:00


oorsprong


antwoorden:


U kunt de "boolean ready ()" -methode proberen. Uit de Java 6 API doc: "Een gebufferde karakterstroom is gereed als de buffer niet leeg is, of als de onderliggende karakterstroom gereed is."

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

13
2018-03-25 17:03



U kunt een a gebruiken PushbackReader. Gebruikend dat u een karakter kunt lezen, dan ongelezen het. Dit stelt je in wezen in staat om het terug te duwen.

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

32
2018-03-25 17:05



De volgende code kijkt naar de eerste byte in de Stream. Zou moeten dienen als een kijkje voor jou.

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

10
2018-03-25 17:03



Het normale idioom is om in een lus te controleren of BufferedReader#readLine() komt niet terug null. Als het einde van de stream wordt bereikt (bijvoorbeeld einde van bestand, socket gesloten, enz.), Dan keert het terug null.

Bijv.

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

Als je niet in regels wilt lezen (wat trouwens de belangrijkste reden is BufferedReader is gekozen), gebruik vervolgens BufferedReader#ready() in plaats daarvan:

BufferedReader reader = new BufferedReader(someReaderSource);
while (reader.ready()) {
    int data = reader.read();
    // ...
}

4
2018-03-25 17:06



BufferedReader br = new BufferedReader(reader);
br.mark(1);
int firstByte = br.read();
br.reset();

2
2018-03-25 17:03



Je zou een a kunnen gebruiken PushBackReader om een ​​personage te lezen en vervolgens "terug te duwen". Op die manier weet je zeker dat er iets was, zonder de algehele staat ervan te beïnvloeden - een "kijkje".


1
2018-03-25 17:06



Het antwoord van pgmura (vertrouwen op de klaar() methode) is eenvoudig en werkt. Maar bedenk dat dit komt doordat Sun de methode heeft geïmplementeerd; wat niet echt overeenkomt met de documentatie. Daar zou ik niet op vertrouwen als dit gedrag kritiek is. Kijk hier http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4090471 Ik ga liever met de PushbackReader-optie.


1
2018-03-25 19:16



mijn oplossing was ... BufferedReader uitbreiden en rij gebruiken als buf, dan kun je de peek-methode in de wachtrij gebruiken.

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;
        }
    }
}

0
2018-01-05 06:21