Question

Y at-il un moyen de vérifier si l'objet est BufferedReader quelque chose à lire? Quelque chose comme le cin.peek() de C. Merci.

Était-ce utile?

La solution

Vous pouvez essayer la méthode « booléen prêt () ». A partir de l'API Java 6 doc: « Un flux de caractères en mémoire tampon est prêt si le tampon n'est pas vide, ou si le flux de caractères sous-jacent est prêt. »

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

Autres conseils

Vous pouvez utiliser un PushbackReader . L'utilisation que vous pouvez lire un caractère, puis non lus se. Cela vous permet essentiellement de le repousser.

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

Le code suivant regardera le premier octet dans le flux. Devrait agir comme un coup d'oeil pour vous.

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

L'expression normale est de vérifier si dans une boucle BufferedReader#readLine() ne retourne pas null. Si la fin du flux est atteinte (par exemple la fin du fichier, la douille fermée, etc), il renvoie null.

par exemple.

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

Si vous ne voulez pas lire dans les lignes (ce qui est d'ailleurs la principale raison pour laquelle un BufferedReader est été choisi), puis utilisez BufferedReader#ready() à la place:

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

Vous pouvez utiliser un PushBackReader lire un caractère, puis « repousser ». De cette façon, vous êtes sûr que quelque chose était là, sans affecter son état général -. « Coup d'oeil » a

La réponse de pgmura (se fondant sur la méthode prêt ()) est simple et fonctionne. Mais gardez à l'esprit que c'est parce que la mise en œuvre du Soleil de la méthode; ce qui ne correspond pas vraiment à la documentation. Je ne me fierais pas à ce sujet, si ce comportement est essentiel. Voir ici http://bugs.sun.com/bugdatabase/view_bug.do? bug_id = 4090471 Je préfère aller avec l'option PushbackReader.

ma solution était .. étendre la file d'attente BufferedReader et utilisation comme buf, vous pouvez utiliser la méthode dans la file 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;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top