openplanning

Hướng dẫn và ví dụ Java PushbackReader

  1. PushbackReader
  2. Examples

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

Show More