betacode

Руководство Java PushbackReader

  1. PushbackReader
  2. Examples

1. PushbackReader

Иногда при работе с потоком ввода символов (character input stream) вам нужно прочитать несколько символов заранее, чтобы увидеть, что произойдет, прежде чем вы сможете определить текущую интерпретацию символов, а затем вы можете отодвинуть их назад. Класс PushbackReader позволяет вам это сделать.
PushbackReader управляет объектом Reader, который считывает данные из источника (например, файла). В то же время PushbackReader также управляет массивом символов - buffer.
В начале нет никакого символа, назначенного массиву buffer. Метод PushbackReader.read возвращает символы из Reader.read.
Если вы вызовете метод PushbackReader.unread чтобы вернуть символы обратно, они будут сохранены в массиве buffer.
При следующем вызове метода PushbackReader.read он возвращает символы, хранящиеся в массиве buffer. Метод Reader.read будет вызван только в том случае, если в массиве buffer нет символа.
PushbackReader​ constructors
public PushbackReader​(Reader in, int size)

public PushbackReader​(Reader in)
  • Конструктор PushbackReader(Reader,int) создает объект PushbackReader с массивом buffer заданного размера.
  • Конструктор PushbackReader(Reader) создает объект PushbackReader с массивом buffer, имеющим размер по умолчанию (size =1).

2. Examples

Предположим, что у вас есть текстовый file с комментариями (comment), начинающимися с 2 знаков минус (--). Как прочитать содержимое файла и удалить комментарии?
test.txt
3 + 5 = 8 -- This is an Addition (+)
100 - 10 = 90 -- This is a Subtraction (-)
-- Multiplication:
2 * 3 = 6
-- Division:
200 / 20 = 10
Вы можете использовать PushbackReader для анализа содержимого вышеупомянутого текстового файла. Когда вы находитесь вне комментария и сталкиваетесь со знаком минус (-), вам нужно прочитать следующий символ, чтобы увидеть, является ли он знаком минус или нет. Это позволяет решить, что делать с текущим символом.
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
Использование FileReader для чтения каждого символа из file занимает много времени. Вы можете использовать BufferedReader для повышения производительности для приведенного выше примера:
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());
    }
}

Руководства Java IO

Show More