從JDK原始碼看OutputStream

超人汪小建發表於2019-02-25

概況

前面已經瞭解了輸入流《從JDK原始碼看InputStream》,接著看對應的輸出流,JDK 給我們提供了很多實用的輸出流 xxxOutputStream,而 OutputStream 是所有位元組輸出流的抽象。包括 ByteArrayOutputStream 、FilterOutputStream 、BufferedOutputStream 、DataOutputStream 和 PushbackOutputStream 等等。

繼承結構

--java.lang.Object
  --java.io.OutputStream
複製程式碼

類定義

public abstract class OutputStream implements Closeable, Flushable
複製程式碼

OutputStream 被定為 public 且 abstract 的類,實現了 Closeable 和 Flushable 介面。

Closeable 介面表示 OutputStream 可以被close,介面定義如下:

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}
複製程式碼

而 Flushable 介面表示 OutputStream 可以進行 flush 操作,介面定義如下。

public interface Flushable {
    void flush() throws IOException;
}
複製程式碼

主要屬性

沒有屬性

主要方法

write方法

一共有三個 write 方法,其中有一個抽象的 write 方法,其餘兩個 write 方法都會呼叫這個抽象方法,該方法用於將一個位元組寫入一個輸出流讀。

主要看第三個 write 方法即可,它傳入的三個引數,byte陣列、偏移量和陣列長度。該方法主要是將指定長度的位元組資料寫入到輸出流中,而在寫入前會檢查陣列是否為空,偏移量和長度是否滿足正確的條件等等。最後才是呼叫抽象方法進行寫操作,抽象方法一般都由子類實現具體的邏輯。


public abstract void write(int b) throws IOException;

    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }
    
    public void write(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if ((off < 0) || (off > b.length) || (len < 0) ||
                   ((off + len) > b.length) || ((off + len) < 0)) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return;
        }
        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }
複製程式碼

flush方法

對該輸出流中緩衝的位元組進行 flush 操作,即之前寫入該輸出流緩衝區的位元組將被強制 flush 到目的地。其中目的地可能的情況為:

  1. 如果是一個檔案,那麼 flush 操作只能保證該輸出流緩衝區的位元組資料寫入到作業系統中等待寫入,而並不能保證將其寫到磁碟上。
  2. 如果是套接字,那麼 flush 操作只能保證寫入到作業系統中等待傳到其他節點,而不能保證其能立刻寫入到遠端節點。
  3. 如果是其他裝置,那麼 flush 也只是將其寫入作業系統,而到達其他裝置則由作業系統控制。
public void flush() throws IOException {}
複製程式碼

close方法

此方法用於關閉輸出流,並且釋放相關資源,作為抽象類,這裡關閉動作不做任何事。另外關閉了的流無法再重新開啟。

public void close() throws IOException {}
複製程式碼

=============廣告時間===============

公眾號的選單已分為“分散式”、“機器學習”、“深度學習”、“NLP”、“Java深度”、“Java併發核心”、“JDK原始碼”、“Tomcat核心”等,可能有一款適合你的胃口。

鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以購買。感謝各位朋友。

為什麼寫《Tomcat核心設計剖析》

=========================

相關閱讀:

從JDK原始碼看InputStream

從JDK原始碼看Writer

歡迎關注:

這裡寫圖片描述

相關文章