Luồng dữ liệu ngầm PipedInputStream và PipedOutputStream trong java

Pipes trong java IO cung cấp khả năng giao tiếp giữa 2 luồng (thread) chạy trên cùng JVM.

PipedInputStream-PipedOutputStream

Giả sử bạn có 2 luồng, A là luồng dữ liệu đầu vào và B là luồng dữ liệu đầu ra. Hai luồng này chạy trên 2 thread khác nhau vậy làm sao để kết nối A và B lại với nhau?

Trong java cung cấp 2 class PipedInputStream đại diện cho luồng dữ liệu đầu vào và PipedOutputStream đại diện cho luồng dữ liệu đầu ra, chúng có thể kết nối với nhau và tự hiểu ngầm ra “tao ghi dữ liệu cho mày – Tao đọc dữ liệu từ mày”.

Output:

I’m thread 2
Hello world, pipe!

Connect trong PipedInputStream

Trong trường hợp tại thời điểm khởi tạo chúng ta chưa xác định điểm PipedOutputStream thì chúng ta có thể sử dụng method connect() để liên kết chúng lại với nhau.

Output:

Use of available() : 6
Using read(buffer, offset, maxlen) : ABCDE
Closing the stream

Các method trong PipedInputStream

PipedInputStream đại diện cho luồng dữ liệu đầu vào chứa các method phục vụ cho việc đọc dữ liệu từ PipedOutputStream.

int read() – Đọc byte tiếp theo từ PipedInputStream. Giá trị byte nằm trong khoảng 0 – 255. Trả về -1 để thông báo rằng đã đọc hết dữ liệu trong PipedInputStream.

int read(byte[] buffer, int offset, int maxlen) – Đọc dữ liệu từ PipedInputStream bắt đầu tại vị trí offset và đọc tối đa maxlen

Output: Using read(buffer, offset, maxlen) : Using read(buffer, offset, maxlen) : __AB_

Sau khi mình chọn offset là 2 thì 2 vị trí đầu tiên của mảng rỗng, và đọc tối đa maxlen là 2 ký tự AB.

void close() – Đóng các kết nối của PipedInputStream đến các tài nguyên mà nó đang tham chiếu đến.

int available() – Trả về số byte còn lại có thể đọc được từ PipedInputStream.

Các method trong PipedOutputStream

PipedOutputStream đại diện cho luồng dữ liệu đầu ra chứa các method phục vụ cho ghi dữ vào PipedOutputStream.

void write(int byte) – Ghi dữ liệu từng byte một vào PipedOutputStream.

void write(byte[] buffer, int offset, int maxlen) – Ghi tối đa maxlen byte bắt đầu từ vị trí offsert trong mảng buffer vào PipedOutStream.

void close() – Đóng kết nối giữa PipedOutputStream với các tài nguyên khác.

void connect(PipedInputStream input) – Kết nối PipedOutputStream với PipedInputStream.

void flush() – Đẩy dữ liệu xuống PipedOutputStream. Trong trường hợp bạn write() dữ liệu xuống vì các mục đích khác nhau như hiệu xuất etc mà dữ liệu chưa được ghi xuống PipedOutputStream, sử dụng flush() để đẩy dữ liệu xuống

Output:

Use of flush() method :
A B C D E
Closing the Output stream

Nguồn tham khảo:

https://docstore.mik.ua/orelly/java/exp/ch08_01.htm

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

Leave a Reply

Your email address will not be published. Required fields are marked *