Lớp PushbackInputStream
(Class PushbackInputStream)

PushbackInputStream là một lớp con của FilterInputStream cung cấp chức năng đặc biệt là "đẩy lại" hoặc "không đọc" một bytemột byte đã đọc trở lại luồng đầu vào. Điều này có ích trong các trường hợp cần đọc một số lượng byte không xác định cho đến khi gặp một ký tự đặc biệt, sau đó "đẩy lùi" ký tự đó để đọc lại.

Chi tiết hoạt động lớp PushbackInputStream

↳ Đọc và đẩy lại byte: Khi đọc dữ liệu từ luồng, nếu gặp phải một byte đặc biệt (ví dụ như dấu phân cách), bạn có thể sử dụng PushbackInputStream để đẩy lại byte đó vào luồng. Điều này cho phép byte được đọc lại trong lần đọc tiếp theo.

↳ Ứng dụng: Ví dụ, nếu bạn đang đọc các byte đại diện cho các ký tự tạo thành một định danh (identifier) và gặp một byte đại diện cho ký tự toán tử (operator), bạn có thể đẩy lại byte của toán tử để sau đó đọc lại nó.

Lợi ích:

↳ Điều khiển luồng dữ liệu: PushbackInputStream cho phép kiểm soát tốt hơn luồng dữ liệu bằng cách cho phép "hoàn tác" một thao tác đọc khi cần thiết.

↳ Xử lý dữ liệu không xác định: Nó rất hữu ích trong việc xử lý các dữ liệu có độ dài không xác định, nơi mà việc đẩy lại byte có thể cần thiết để đảm bảo dữ liệu được đọc đúng cách.

Khai báo lớp PushbackInputStream trong Java

Để sử dụng lớp PushbackInputStream, bạn cần import gói java.io bạn cần thêm câu lệnh import vào đầu file Java của mình. Gói này cung cấp các lớp và giao diện để thực hiện các hoạt động nhập xuất (I/O) trong Java.

Cú pháp câu lệnh import:

Cú pháp

import java.io.PushbackInputStream;

Cú pháp khai báo lớp PushbackInputStream:

Cú pháp

public class PushbackInputStream
extends FilterInputStream

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public class PushbackInputStream: Đây là khai báo một lớp công khai (public) tên là PushbackInputStream. Lớp này có thể được truy cập từ bất kỳ đâu trong dự án Java, miễn là nó được import hoặc ở cùng gói.

↳ Kế thừa từ FilterInputStream: PushbackInputStream là một lớp con của FilterInputStream, vì vậy nó thừa hưởng tất cả các phương thức và thuộc tính của FilterInputStream.

FilterInputStream là một lớp trung gian giúp tạo ra các luồng đầu vào được lọc, nghĩa là nó có thể thêm các chức năng bổ sung (như pushback) vào một luồng đầu vào hiện có.

↳ Chức Năng Của PushbackInputStream: Pushback (Đẩy Lại Byte): Khác với các InputStream khác, PushbackInputStream cho phép bạn "đẩy lại" các byte mà bạn đã đọc. Điều này rất hữu ích trong các tình huống mà bạn cần kiểm tra byte đầu tiên để quyết định làm gì tiếp theo, nhưng không muốn mất đi byte đó sau khi đã kiểm tra.

↳ Sử Dụng Đệm (Buffer): PushbackInputStream sử dụng một bộ đệm (buffer) để lưu trữ các byte đã bị đẩy lại. Khi bạn đọc lại từ luồng, nó sẽ kiểm tra bộ đệm trước để xem liệu có byte nào đã bị đẩy lại trước đó không.

Các trường của lớp PushbackInputStream

Lớp PushbackInputStream kế thừa một trường từ lớp cha FilterInputStream và có hai trường riêng của nó:

↳ Trường được thừa hưởng in: Là luồng đầu vào cơ bản được thừa hưởng từ FilterInputStream. PushbackInputStream sẽ đọc dữ liệu từ in và có thể đẩy lùi byte vào in.

↳ protected byte[] (buf): Là một mảng byte được sử dụng làm bộ đệm đẩy lùi (pushback buffer). Kích thước của bộ đệm này thường nhỏ, chỉ đủ để lưu trữ một byte. Lưu trữ byte đã đọc mà cần đẩy lùi lại vào luồng đầu vào.

↳ protected int (pos): Là một số nguyên (int) biểu thị vị trí trong bộ đệm đẩy lùi. Chỉ ra vị trí của byte tiếp theo sẽ được đọc từ bộ đệm. Giá trị này thường là 0 hoặc 1, tùy thuộc vào việc có byte nào đang được lưu trữ trong bộ đệm hay không.

Lưu ý: Các trường này được đánh dấu protected, có nghĩa là chúng chỉ truy cập được từ lớp PushbackInputStream và các lớp con của nó. Bạn không nên truy cập trực tiếp vào các trường này mà nên sử dụng các phương thức của lớp để tương tác với chúng.

Các constructor của lớp PushbackInputStream

Lớp PushbackInputStream có hai constructor để tạo đối tượng và thiết lập bộ đệm đẩy lùi:

↳ PushbackInputStream(InputStream in): Tạo một PushbackInputStream với kích thước bộ đệm mặc định. Lưu trữ tham chiếu đến luồng đầu vào cơ bản in để sử dụng sau này.

↳ PushbackInputStream(InputStream in, int size): Tạo một PushbackInputStream với kích thước bộ đệm tùy chỉnh được chỉ định bởi tham số size. Lưu trữ tham chiếu đến luồng đầu vào cơ bản in để sử dụng sau này.

Các phương thức của lớp PushbackInputStream

Lớp PushbackInputStream kế thừa một số phương thức từ FilterInputStream và cung cấp thêm các phương thức để thực hiện chức năng đẩy lùi byte. Dưới đây là danh sách tất cả các phương thức của lớp FilterInputStream trong Java:

↳ int read(byte[] b): Đọc một số lượng byte từ luồng đầu vào và lưu vào mảng byte b.

↳ int read(byte[] b, int off, int len): Đọc tối đa len byte từ luồng đầu vào vào mảng byte b bắt đầu từ vị trí off.

↳ int read(): Đọc một byte từ luồng đầu vào.

↳ void close(): Đóng luồng đầu vào và giải phóng tài nguyên.

↳ void mark(int readlimit): Đánh dấu vị trí hiện tại trong luồng để có thể quay lại sau này.

↳ boolean markSupported(): Trả về false vì PushbackInputStream không hỗ trợ đánh dấu.

↳ void reset(): Quay lại vị trí đã được đánh dấu trước đó.

↳ long skip(long n): Bỏ qua một số lượng byte trong luồng.

↳ int available(): Trả về số lượng byte có thể đọc được mà không bị chặn.

↳ void unread(byte[] b): Đẩy lùi một mảng byte vào đầu bộ đệm đẩy lùi.

↳ void unread(byte[] b, int off, int len): Đẩy lùi một phần của mảng byte vào đầu bộ đệm đẩy lùi.

↳ void unread(int b): Đẩy lùi một byte vào đầu bộ đệm đẩy lùi.

Ví dụ

Dưới đây là một ví dụ đơn giản về cách sử dụng PushbackInputStream:

Ví dụ: Example.java

 import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PushbackInputStream;

public class Example {
    public static void main(String[] args) {
        String str = "Hello, world!";
        byte[] bytes = str.getBytes();

        try (PushbackInputStream pbis = new PushbackInputStream(new ByteArrayInputStream(bytes))) {
            int data = pbis.read();
            System.out.println("Đọc byte: " + (char) data); // Đọc byte đầu tiên

            // Đẩy lại byte đã đọc
            pbis.unread(data);
            System.out.println("Byte đẩy lùi: " + (char) data);

            // Đọc lại byte đã đẩy lại
            data = pbis.read();
            System.out.println("Đọc lại byte: " + (char) data);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Kết quả của chương trình là:

Đọc byte: H
Byte đẩy lùi: H
Đọc lại byte: H

PushbackInputStream là một công cụ hữu ích khi bạn cần kiểm tra các byte từ luồng đầu vào nhưng vẫn muốn có khả năng đọc lại chúng sau đó. Thường được sử dụng trong các trình phân tích cú pháp hoặc các ứng dụng cần đọc trước một phần dữ liệu để quyết định cách xử lý tiếp theo mà không làm mất dữ liệu đó.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”