codestory

Die Anleitung zu Java PushbackReader

  1. PushbackReader
  2. Examples

1. PushbackReader

Manchmal bei dem Arbeiten mit einem Zeicheneingabestream (character input stream) sollen Sie einigen Zeichen im Voraus lesen um zu wissen, was passieren wird. Bevor Sie die aktuelle Zeicheninterpretation definieren können, können Sie sie zurückschieben. Mit der Klasse PushbackReader können Sie dies tun.
PushbackReader verwaltet ein Objekt Reader. Das Objekt wird die Daten aus der Quelle (z.B die Datei) lesen. Gleichzeitig verwaltet PushbackReader ein Zeichenarray- buffer.
Zu Beginn wird keine Zeichen dem buffer zugewiesen. Die Methode PushbackReader.read wird die Zeichen aus Reader.read zurückgeben.
Wenn Sie die Methode PushbackReader.unread zum Zurückschieben der Zeichen aufrufen, werden sie im Array buffer gelagert.
Wenn Sie das nächste Mal die Methode PushbackReader.read aufrufen, werden die im Array buffer gespeichert. Die Methode Reader.read wird nur aufgerufen wenn keine Zeichen mehr im Array buffer vorhanden sind.
PushbackReader​ constructors
public PushbackReader​(Reader in, int size)

public PushbackReader​(Reader in)
  • Der Contructor PushbackReader(Reader,int) erstellt ein Objekt PushbackReader mit dem Array buffer , dessen Größe festgelegt wird.
  • Der Contructor PushbackReader(Reader) erstellt ein Objekt PushbackReader mit dem Array buffer mit der Defaultgröße (size = 1).

2. Examples

Angenommen, Sie haben eine Textdatei mit der Kommentaren, die mit 2 Minuszeichen (--) beginnen. Wie lese ich den Inhalt der Datei und entferne die Kommentare?
test.txt
3 + 5 = 8 -- This is an Addition (+)
100 - 10 = 90 -- This is a Subtraction (-)
-- Multiplication:
2 * 3 = 6
-- Division:
200 / 20 = 10
Sie können PushbackReader verwenden um die Inhalt der oben erwähnten Textdatei zu analysieren. Wenn Sie sich außerhalb eines Kommentars befinden und auf ein Minuszeichen (-) stoßen, müssen Sie das nächste Zeichen lesen, um festzustellen, ob es sich um ein Minuszeichen handelt oder nicht, um zu entscheiden, was mit dem aktuellen Zeichen geschehen soll.
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
Die Verwendung eines FileReader zum Lesen jeder Zeichen kostet viele Zeit. Sie können BufferedReader verwenden um die Leistung des Beispiel oben zu verbessern:
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());
    }
}

Die Anleitungen Java IO

Show More