Руководство Java PushbackReader
View more Tutorials:
Иногда при работе с потоком ввода символов (character input stream) вам нужно прочитать несколько символов заранее, чтобы увидеть, что произойдет, прежде чем вы сможете определить текущую интерпретацию символов, а затем вы можете отодвинуть их назад. Класс PushbackReader позволяет вам это сделать.

- TODO Link!
- TODO Link!
- TODO Link!
- TODO Link!
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).
Предположим, что у вас есть текстовый 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()); } }