Le Tutoriel de Java PushbackReader
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.
![](https://s1.o7planning.com/web-rs/web-image/fr/arf-1185982-vi.webp)
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.
![](https://s1.o7planning.com/web-rs/web-image/fr/arf-1186005-vi.webp)
Au début, aucun caractère n'est affecté au tableau buffer. La méthode PushbackReader.read renvoie les caractères de Reader.read.
![](https://s1.o7planning.com/web-rs/web-image/fr/arf-1186011-vi.webp)
Si vous appelez la méthode PushbackReader.unread pour repousser les caractères, ils sont stockés dans un tableau buffer.
![](https://s1.o7planning.com/web-rs/web-image/fr/arf-1186017-vi.webp)
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
- Le Tutoriel de Java CharArrayWriter
- Le Tutoriel de Java FilterReader
- Le Tutoriel de Java FilterWriter
- Le Tutoriel de Java PrintStream
- Le Tutoriel de Java BufferedReader
- Le Tutoriel de Java BufferedWriter
- Le Tutoriel de Java StringReader
- Le Tutoriel de Java StringWriter
- Le Tutoriel de Java PipedReader
- Le Tutoriel de Java LineNumberReader
- Le Tutoriel de Java PushbackReader
- Le Tutoriel de Java PrintWriter
- Tutoriel sur les flux binaires Java IO
- Le Tutoriel de Java IO Character Streams
- Le Tutoriel de Java BufferedOutputStream
- Le Tutoriel de Java ByteArrayOutputStream
- Le Tutoriel de Java DataOutputStream
- Le Tutoriel de Java PipedInputStream
- Le Tutoriel de Java OutputStream
- Le Tutoriel de Java ObjectOutputStream
- Le Tutoriel de Java PushbackInputStream
- Le Tutoriel de Java SequenceInputStream
- Le Tutoriel de Java BufferedInputStream
- Le Tutoriel de Java Reader
- Le Tutoriel de Java Writer
- Le Tutoriel de Java FileReader
- Le Tutoriel de Java FileWriter
- Le Tutoriel de Java CharArrayReader
- Le Tutoriel de Java ByteArrayInputStream
- Le Tutoriel de Java DataInputStream
- Le Tutoriel de Java ObjectInputStream
- Le Tutoriel de Java InputStreamReader
- Le Tutoriel de Java OutputStreamWriter
- Le Tutoriel de Java InputStream
- Le Tutoriel de Java FileInputStream
Show More