Руководство Java PushbackReader
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
- Руководство Java CharArrayWriter
- Руководство Java FilterReader
- Руководство Java FilterWriter
- Руководство Java PrintStream
- Руководство Java BufferedReader
- Руководство Java BufferedWriter
- Руководство Java StringReader
- Руководство Java StringWriter
- Руководство Java PipedReader
- Руководство Java LineNumberReader
- Руководство Java PushbackReader
- Руководство Java PrintWriter
- Руководство Java IO Binary Streams
- Руководство Java IO Character Streams
- Руководство Java BufferedOutputStream
- Руководство Java ByteArrayOutputStream
- Руководство Java DataOutputStream
- Руководство Java PipedInputStream
- Руководство Java OutputStream
- Руководство Java ObjectOutputStream
- Руководство Java PushbackInputStream
- Руководство Java SequenceInputStream
- Руководство Java BufferedInputStream
- Руководство Java Reader
- Руководство Java Writer
- Руководство Java FileReader
- Руководство Java FileWriter
- Руководство Java CharArrayReader
- Руководство Java ByteArrayInputStream
- Руководство Java DataInputStream
- Руководство Java ObjectInputStream
- Руководство Java InputStreamReader
- Руководство Java OutputStreamWriter
- Руководство Java InputStream
- Руководство Java FileInputStream
Show More