系統學習 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

目錄:系統學習 Java IO---- 目錄,概覽html

PipedInputStream 類使得能夠做爲字節流讀取管道的內容。 管道是同一 JVM 內的線程之間的通訊通道。java

使用兩個已鏈接的管道流時,要爲每一個流操做建立一個線程,
read() 和 write() 都是阻塞方法,若是一個線程同時讀寫就會形成死鎖ide

看一個例子:學習

public class Pipe {
    public static void main(String[] args) throws IOException {
        final PipedOutputStream output = new PipedOutputStream();
        final PipedInputStream input = new PipedInputStream(output);

        // 寫線程,建立匿名 Runnable 對象
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    output.write("Hello Pipe".getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        // 讀線程,用一下 Lambda 表達式建立匿名 Runnable 對象
        Thread thread2 = new Thread(() -> {
            try {
                int data = input.read();
                while (data != -1) {
                    System.out.print((char) data);
                    data = input.read();
                }
                System.out.println();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        );
        thread1.start();
        thread2.start();
    }
}

這裏經過利用構造方法來直接指定管道輸入流的管道輸出流。
PipedInputStream input = new PipedInputStream(output);線程

也能夠使用 pipe1.connect(pipe2) 來鏈接兩個管道流,例如:
PipedInputStream pis = new PipedInputStream(); pis.connect(pos);code

除了管道以外,還有許多其餘方法能夠在同一個 JVM 中進行通訊。
事實上,線程更常常交換完整的對象而不是原始的字節數據。
可是若是須要在線程之間交換原始字節數據,Java IO 的管道是能作到的。htm

相關文章
相關標籤/搜索