devstory

Le Tutoriel de Java PushbackReader

  1. PushbackReader
  2. Examples

1. PushbackReader

Parfois, lorsque vous travaillez avec un flux d'entrée de caractères (character input stream), vous devez lire quelques caractères à l'avance pour voir ce qui va se passer, avant de pouvoir définir l'interprétation actuelle des caractères, vous pouvez les repousser. La classe PushbackReader vous permet de le faire.
PushbackReader gère un objet Reader, qui lit les données à partir de l'origine (comme un fichier, par exemple). En même temps, PushbackReader gère également un tableau de caractères - buffer.
Au début, aucun caractère n'est affecté au tableau buffer. La méthode PushbackReader.read renvoie les caractères de Reader.read.
Si vous appelez la méthode PushbackReader.unread pour repousser les caractères, ils sont stockés dans un tableau buffer.
La prochaine fois que vous appelez la méthode PushbackReader.read, elle renvoie les caractères stockés dans le tableau buffer. La méthode Reader.read ne sera appelée que s'il n'y a pas de caractère dans le tableau buffer.
PushbackReader​ constructors
public PushbackReader​(Reader in, int size)

public PushbackReader​(Reader in)
  • Le constructeur PushbackReader(Reader,int) crée un objet PushbackReader avec un tableau buffer ayant une taille spécifiée.
  • Le constructeur PushbackReader(Reader) crée un objet PushbackReader avec un tableau buffer de taille par défaut (size =1).

2. Examples

On suppose que vous disposiez d'un fichier texte avec des commentaires initiés par 2 signes moins (--). Comment lire le contenu du fichier et supprimer les commentaires?
test.txt
3 + 5 = 8 -- This is an Addition (+)
100 - 10 = 90 -- This is a Subtraction (-)
-- Multiplication:
2 * 3 = 6
-- Division:
200 / 20 = 10
Vous pouvez utiliser PushbackReader pour analyser le contenu du fichier texte susmentionné. Lorsque vous êtes en dehors d'un commentaire et que vous rencontrez un signe moins (-), vous devez lire le caractère qui le suit pour voir s'il s'agit d'un signe moins ou pas avant de décider quoi faire avec le caractère actuel.
PushbackReaderEx1.java
package org.o7planning.pushbackreader.ex;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PushbackReader;
import java.io.Reader;

public class PushbackReaderEx1 {

    public static void main(String[] args) throws IOException {

        Reader reader = new FileReader(new File("test.txt"));

        PushbackReader pr = new PushbackReader(reader);

        StringBuilder sb = new StringBuilder();
        boolean inComment = false;

        int ch;
        while ((ch = pr.read()) != -1) {
            if (inComment) {
                if (ch == '\n') {
                    sb.append((char)ch);
                    inComment = false;
                }
                continue;
            } else {
                if (ch == '-') {
                    // Read next char
                    int nextChar = pr.read();
                    if (nextChar == -1 || nextChar != '-') {
                        sb.append((char) ch);
                        pr.unread(nextChar); // Push back nextChar into stream.
                    } else {
                        inComment = true;
                    }
                } else {
                    sb.append((char)ch);
                }
            }
        }
        pr.close();
        System.out.println(sb.toString());
    }
}
Output:
3 + 5 = 8
100 - 10 = 90

2 * 3 = 6

200 / 20 = 10
L'utilisation d'un FileReader pour lire chaque caractère du fichier prend beaucoup de temps. Vous pouvez utiliser BufferedReader pour améliorer les performances de l'exemple ci-dessus:
PushbackReaderEx1b.java
package org.o7planning.pushbackreader.ex;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PushbackReader;
import java.io.Reader;

public class PushbackReaderEx1b {

    public static void main(String[] args) throws IOException {

        // Wrap the FileReader by a BufferedReader.
        Reader reader = new BufferedReader(new FileReader(new File("test.txt")));

        PushbackReader pr = new PushbackReader(reader);

        StringBuilder sb = new StringBuilder();
        boolean inComment = false;

        int ch;
        while ((ch = pr.read()) != -1) {
            if (inComment) {
                if (ch == '\n') {
                    sb.append((char)ch);
                    inComment = false;
                }
                continue;
            } else {
                if (ch == '-') {
                    // Read next char
                    int nextChar = pr.read();
                    if (nextChar == -1 || nextChar != '-') {
                        sb.append((char) ch);
                        pr.unread(nextChar); // Push back nextChar into stream.
                    } else {
                        inComment = true;
                    }
                } else {
                    sb.append((char)ch);
                }
            }
        }
        pr.close();
        System.out.println(sb.toString());
    }
}

Tutoriels Java IO

Show More