Lớp PipedOutputStream
(Class PipedOutputStream)

Lớp PipedOutputStream kế thừa từ OutputStream và được sử dụng để kết nối với một luồng đầu vào PipedInputStream, tạo ra một ống dẫn dữ liệu (pipe) để truyền thông. PipedOutputStream là đầu cuối gửi của ống dẫn, trong đó dữ liệu thường được ghi vào đối tượng PipedOutputStream bởi một luồng (thread) và được đọc từ PipedInputStream kết nối bởi một luồng khác.

Việc sử dụng cả PipedOutputStream và PipedInputStream trong cùng một luồng là không được khuyến khích vì có thể dẫn đến tình trạng deadlock, tức là luồng bị khóa vĩnh viễn. Ống dẫn được coi là bị hỏng (broken) nếu luồng đang đọc các byte dữ liệu từ PipedInputStream kết nối không còn hoạt động.

Khai báo lớp PipedOutputStream trong Java

Để sử dụng lớp PipedOutputStream, 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.PipedOutputStream;

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

Cú pháp

public class PipedOutputStream
extends OutputStream

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

↳ public class PipedOutputStream: Đây là khai báo một lớp công khai (public) tên là PipedOutputStream. 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.

↳ extends OutputStream: Điều này có nghĩa là lớp PipedOutputStream kế thừa từ lớp OutputStream. OutputStream là một lớp cơ sở trừu tượng trong Java đại diện cho một luồng dữ liệu đầu ra. Lớp này cung cấp các phương thức để ghi dữ liệu vào luồng đầu ra. Khi PipedOutputStream kế thừa từ OutputStream, nó thừa hưởng tất cả các phương thức của OutputStream và có thể sử dụng hoặc ghi đè (override) các phương thức đó.

Các constructor của lớp PipedOutputStream

Lớp PipedOutputStream có hai constructor để tạo đối tượng và thiết lập kết nối với PipedInputStream.

↳ PipedOutputStream(): Tạo một PipedOutputStream chưa được kết nối với PipedInputStream. Phải kết nối với PipedInputStream bằng phương thức connect() trước khi sử dụng.

↳ PipedOutputStream(PipedInputStream snk): Tạo một PipedOutputStream và kết nối nó với PipedInputStream được chỉ định. Không cần gọi phương thức connect() vì đã được kết nối sẵn.

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

Lớp PipedOutputStream cung cấp các phương thức để ghi dữ liệu vào luồng đầu ra. Dưới đây là danh sách tất cả các phương thức của lớp PipedOutputStream trong Java:

↳ void write(byte[] b, int off, int len): Ghi một phần của mảng byte vào luồng đầu ra.

↳ void write(int b): Ghi một byte vào luồng đầu ra.

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

↳ void flush(): Xả dữ liệu đệm ra luồng đầu ra.

↳ void connect(PipedInputStream snk): Kết nối PipedOutputStream với PipedInputStream được chỉ định.

Ví dụ

Dưới đây là một ví dụ đơn giản sử dụng PipedOutputStream và PipedInputStream:

Ví dụ: Example.java

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Example {
    public static void main(String[] args) {
        PipedInputStream pipedInputStream = new PipedInputStream();
        PipedOutputStream pipedOutputStream = new PipedOutputStream();

        try {
            // Kết nối PipedInputStream với PipedOutputStream
            pipedOutputStream.connect(pipedInputStream);

            // Tạo luồng ghi dữ liệu
            Thread writerThread = new Thread(() -> {
                try {
                    String message = "Hello from PipedOutputStream!";
                    pipedOutputStream.write(message.getBytes());
                    pipedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            // Tạo luồng đọc dữ liệu
            Thread readerThread = new Thread(() -> {
                try {
                    int data;
                    while ((data = pipedInputStream.read()) != -1) {
                        System.out.print((char) data);
                    }
                    pipedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            // Bắt đầu các luồng
            writerThread.start();
            readerThread.start();

            // Đợi các luồng hoàn tất
            writerThread.join();
            readerThread.join();

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

Hello from PipedOutputStream!

Lưu ý:

↳ Đồng bộ: Cần chú ý đến đồng bộ hóa khi sử dụng PipedInputStream và PipedOutputStream trong các ứng dụng đa luồng.

↳ Xử lý ngoại lệ: Đảm bảo xử lý các ngoại lệ liên quan đến I/O và gián đoạn luồng.

↳ Lớp PipedInputStream và PipedOutputStream là một công cụ mạnh mẽ cho việc truyền dữ liệu giữa các luồng trong Java, giúp tối ưu hóa các ứng dụng đa luồng.

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.”