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.
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
- 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