Hướng dẫn và ví dụ Java PushbackReader
1. PushbackReader
Đôi khi làm việc với một luồng đầu vào ký tự (character input stream) bạn cần đọc trước một vài ký tự để xem điều gì sắp xảy ra, trước khi bạn có thể xác định cách diễn giải ký tự hiện tại, sau đó bạn có thể đẩy chúng trở lại. Lớp PushbackReader cho phép bạn làm điều đó.
PushbackReader quản lý một đối tượng Reader, đối tượng này sẽ đọc dữ liệu từ nguồn gốc (chẳng hạn file), đồng thời PushbackReader cũng quản lý một mảng ký tự - buffer.
Tại thời điểm ban đầu, không có một ký tự nào được gán vào mảng buffer. Phương thức PushbackReader.read sẽ trả về các ký tự từ Reader.read.
Nếu bạn gọi phương thức PushbackReader.unread để đẩy các ký tự trở lại, chúng sẽ được lưu trữ trên mảng buffer.
Trong lần tiếp theo, nếu bạn gọi phương thức PushbackReader.read, nó sẽ trả về các ký tự đã được lưu trữ trên mảng buffer. Phương thức Reader.read sẽ chỉ được gọi nếu không còn ký tự nào trên mảng buffer.
PushbackReader constructors
public PushbackReader(Reader in, int size)
public PushbackReader(Reader in)
- Contructor PushbackReader(Reader,int) tạo ra một đối tượng PushbackReader với mảng buffer có kích thước được chỉ định.
- Contructor PushbackReader(Reader) tạo ra một đối tượng PushbackReader với mảng buffer có kích thước mặc định (size = 1).
2. Examples
Giả sử rằng bạn có một file văn bản với các chú thích (comment) bắt đầu bởi 2 dấu trừ (--). Làm sao để đọc nội dung của file và loại bỏ các chú thích?
test.txt
3 + 5 = 8 -- This is an Addition (+)
100 - 10 = 90 -- This is a Subtraction (-)
-- Multiplication:
2 * 3 = 6
-- Division:
200 / 20 = 10
Bạn có thể sử dụng PushbackReader để phân tích nội dung của file văn bản nói trên. Khi ở bên ngoài một chú thích và bắt gặp một ký tự là dấu trừ (-) bạn cần đọc tiếp một ký tự tiếp theo xem nó có phải là một dấu trừ nữa hay không để quyết định cần phải làm gì với ký tự hiện tại.
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
Việc sử dụng một FileReader để đọc từng ký tự từ file sẽ tốn rất nhiều thời gian, bạn có thể sử dụng BufferedReader cải tiến hiệu xuất của ví dụ trên:
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());
}
}
Các hướng dẫn Java IO
- Hướng dẫn và ví dụ Java CharArrayWriter
- Hướng dẫn và ví dụ Java FilterReader
- Hướng dẫn và ví dụ Java FilterWriter
- Hướng dẫn và ví dụ Java PrintStream
- Hướng dẫn và ví dụ Java BufferedReader
- Hướng dẫn và ví dụ Java BufferedWriter
- Hướng dẫn và ví dụ Java StringReader
- Hướng dẫn và ví dụ Java StringWriter
- Hướng dẫn và ví dụ Java PipedReader
- Hướng dẫn và ví dụ Java LineNumberReader
- Hướng dẫn và ví dụ Java PushbackReader
- Hướng dẫn và ví dụ Java PrintWriter
- Hướng dẫn sử dụng luồng vào ra nhị phân trong Java
- Hướng dẫn sử dụng luồng vào ra ký tự trong Java
- Hướng dẫn và ví dụ Java BufferedOutputStream
- Hướng dẫn và ví dụ Java ByteArrayOutputStream
- Hướng dẫn và ví dụ Java DataOutputStream
- Hướng dẫn và ví dụ Java PipedInputStream
- Hướng dẫn và ví dụ Java OutputStream
- Hướng dẫn và ví dụ Java ObjectOutputStream
- Hướng dẫn và ví dụ Java PushbackInputStream
- Hướng dẫn và ví dụ Java SequenceInputStream
- Hướng dẫn và ví dụ Java BufferedInputStream
- Hướng dẫn và ví dụ Java Reader
- Hướng dẫn và ví dụ Java Writer
- Hướng dẫn và ví dụ Java FileReader
- Hướng dẫn và ví dụ Java FileWriter
- Hướng dẫn và ví dụ Java CharArrayReader
- Hướng dẫn và ví dụ Java ByteArrayInputStream
- Hướng dẫn và ví dụ Java DataInputStream
- Hướng dẫn và ví dụ Java ObjectInputStream
- Hướng dẫn và ví dụ Java InputStreamReader
- Hướng dẫn và ví dụ Java OutputStreamWriter
- Hướng dẫn và ví dụ Java InputStream
- Hướng dẫn và ví dụ Java FileInputStream
Show More
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn Java New IO
- Các hướng dẫn Spring Cloud
- Các hướng dẫn Java Oracle ADF
- Các hướng dẫn Java Collections Framework
- Java cơ bản
- Các hướng dẫn Java Date Time
- Các thư viện mã nguồn mở Java
- Các hướng dẫn Java Web Services
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Boot