Java 日看一類(45)之IO包中的PipedWriter

該類繼承自Writer類

無引入包



類頭註釋如下:

* Piped character-output streams.

大意如下:

管道字符型輸出流



該類含有如下的成員變量:

對應的管道流輸入流

private PipedReader sink;

關閉標誌符

private boolean closed = false;



該類含有如下的成員方法:

構造函數(與給定的輸入管道相連接

public PipedWriter(PipedReader snk)  throws IOException {
    connect(snk);
}

構造函數(默認,無連接管道

public PipedWriter() {
}

管道連接

public synchronized void connect(PipedReader snk) throws IOException {
    if (snk == null) {//檢查輸入管道有效性
        throw new NullPointerException();
    } else if (sink != null || snk.connected) {//檢查連接狀態
        throw new IOException("Already connected");
    } else if (snk.closedByReader || closed) {//檢查活動情況
        throw new IOException("Pipe closed");
    }

    sink = snk;
    snk.in = -1;//初始化緩衝區指針
    snk.out = 0;
    snk.connected = true;
}

寫入字符數組數據

public void write(char cbuf[], int off, int len) throws IOException {
    if (sink == null) {
        throw new IOException("Pipe not connected");
    } else if ((off | len | (off + len) | (cbuf.length - (off + len))) < 0) {
        throw new IndexOutOfBoundsException();
    }
    sink.receive(cbuf, off, len);//調用輸入流的讀取函數
}

刷新輸出流

public synchronized void flush() throws IOException {
    if (sink != null) {//檢測連接狀態
        if (sink.closedByReader || closed) {//輸入端活性和管道關閉情況
            throw new IOException("Pipe closed");
        }
        synchronized (sink) {
            sink.notifyAll();//喚醒所有掛起的線程(主要還是讀線程,把緩衝區內容讀出,寫線程會自動阻塞
        }
    }
}

關閉管道連接

public void close()  throws IOException {
    closed = true;
    if (sink != null) {
        sink.receivedLast();//喚醒所有線程,修改關閉狀態
    }
}




該類與PipedOutputStream類似,主要也是調用輸入流的函數和方法,本體作爲一個抽象出的控制模塊而存在,主要功能都在PipedReader裏,請先去學習該類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章