Tags:

Nhìn trộm dữ liệu với PushbackInputStream

Khi đọc dữ liệu từ InputStream, đôi lúc chúng ta cần xem trước một vài byte khi đọc dữ liệu từ InputStream để xem có quyết định hướng đọc tiếp theo. PushbackInputStream cho phép bạn làm điều đó bằng cách cho phép bạn đẩy các byte đã được đọc ngược vào InputStream, những byte này sẽ được đọc ở những lần gọi read() sau.

PushbackInputStream input = new PushbackInputStream(
                                new FileInputStream("c:\\data\\input.txt"));

int data = input.read();

input.unread(data);

Khi chúng ta gọi read() thì một byte sẽ được đọc từ InputStream. unread() method đẩy byte vừa được đọc ngược lại InputStream, và như vậy ở lần gọi read() tiếp theo chúng ta sẽ được một byte như lần gọi trước. Nếu chúng ta đẩy nhiều byte cùng lúc vào InputStream thì byte được đọc cuối cùng sẽ được đẩy vào trước cứ như thế cho đến hết, về cơ bản nó hoạt động tương tự như Stack (vào sau ra trước)

Constructor PushbackInputStream

PushbackInputStream(InputStream in): Khởi tạo PushbackInputStream object cho phép tối đa 1 byte trả lại InputStream.

PushbackInputStream(InputStream in, int numBytes): Khởi tạo PushbackInputStream object với một mảng bộ nhớ đệm buffer có kích thước numBytes. Cho phép đẩy một mảng buffer về InputStream.

Ví dụ PushbackInputStream

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

class PushbackInputStreamExample {
    public static void main(String arg[]) {
        String str = "Welcome to Shareprogramming.net ";
        byte b[] = str.getBytes();

        try (ByteArrayInputStream bout = new ByteArrayInputStream(b);
             PushbackInputStream push = new PushbackInputStream(bout, 100)) {

            PrintWriter pw = new PrintWriter(System.out, true);
            
            int c;
            while ((c = push.read()) != -1) {
                pw.print((char) c);
            }
            pw.println();

            // unread method
            push.unread(b);
            push.unread(b, 0, 7);

            while ((c = push.read()) != -1) {
                pw.print((char) c);
            }
            pw.println();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Output:

Welcome to Shareprogramming.net
WelcomeWelcome to Shareprogramming.net

Note: Nếu chúng ta sử dụng constructor PushbackInputStream(InputStream in) thì mặc định size buffer là 1, nếu chúng ta đẩy một mảng byte lớn hơn 1 về lại InputStream thì sẽ gây lỗi java.io.IOException: Push back buffer is full

Đọc dữ liệu trong PushbackInputStream

Để đọc dữ liệu trong PushbackInputStream chúng ta có đến 3 biến thể read() method với các nhiệm vụ khác nhau

  • read() – Đọc từng tự từng byte
  • read(byte[] buffer) – Đọc byte vào một mảng buffer được chỉ định tại tham số truyền vào.
  • read(byte[] buffer, int off, int len) – Đọc byte vào mảng buffer được chỉ định trong tham số truyền vào bắt đầu ghi tại vị trí off và tối đa len byte.
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.PushbackInputStream;


class PushbackInputStreamDemo {
    public static void main(String arg[]) throws IOException {
        String str = "Shareprogramming.net ";
        byte b[] = str.getBytes();
        PrintWriter pw = new PrintWriter(System.out, true);
        try (ByteArrayInputStream bout = new ByteArrayInputStream(b);
             PushbackInputStream push = new PushbackInputStream(bout)) {
            int c;
            while ((c = push.read()) != -1) {
                pw.print((char) c);
            }
            pw.println();
            push.read(b, 0, 16);
            for (int i = 0; i < 16; i++) {
                pw.print((char) b[i]);
            }
            pw.println();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }



    }
}

Output

Shareprogramming.net
Shareprogramming

Đẩy dữ liệu trở lại InputStream

Có bao nhiêu cách đọc thì cũng tương ứng có bấy nhiêu cách đẩy dữ liệu trở lại InputStream

  • unread() – Đẩy một byte được đọc cuối cùng vào InputStream
  • unread(byte[] buffer) – Đẩy một mảng byte buffer vào lại InputStream
  • unread(byte[] buffer, int off, int len) – Đẩy mảng byte con của buffer bắt đầu tại vị trí off và đối đa len byte.
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.PushbackInputStream;

class PushbackInputStreamDemo {
    public static void main(String arg[]) {
        PrintWriter pw = new PrintWriter(System.out, true);
        String str = "Shareprogramming.net ";
        byte b[] = str.getBytes();
        try (
                ByteArrayInputStream bout = new ByteArrayInputStream(b);
                PushbackInputStream push = new PushbackInputStream(bout, 100)) {

            int c;
            while ((c = push.read()) != -1) {
                pw.print((char) c);
            }
            pw.println();

            // unread method
            push.unread(b);
            push.unread(b, 0, 5);

            while ((c = push.read()) != -1) {
                pw.print((char) c);
            }
            pw.println();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Output

Shareprogramming.net
ShareShareprogramming.net

Đóng kết nối PushbackInputStream

Sử dụng close() method để đóng các kết nối giữa PushbackInputStream với các tài nguyên mà nó đang kết nối.

pushbackInputStream.close();

Kết luận

PushbackInputStream sẽ rất hữu dụng khi chúng ta có nhu cầu xem trước dữ liệu từ InputStream hoặc muốn đẩy các byte dữ liệu đã được đọc vào lại InputStream vì một lý do nào đó.

Nguồn tham khảo

https://www.geeksforgeeks.org/java-io-pushbackinputstream-class-java/

http://tutorials.jenkov.com/java-io/pushbackinputstream.html

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x