Writer 是一個用于寫字元流的抽象類,它将一些相通的寫相關操作抽象到此類,友善各種寫操作類的實作。一般來說子類隻需要實作它的 write、flush 、close 等三個方法,但如果有需要還可以重寫 Writer 提供的公共方法。
JDK 在 Writer 的基礎上實作了很多有用的 xxxWriter ,包括 BufferedWriter、CharArrayWriter、FilterWriter、OutputStreamWriter、FileWriter、PipedWriter、StringWriter 和 PrintWriter 等等。
Writer 被定為 public 且 abstract 的類,實作了 Appendable、Closeable 和 Flushable接口。
Appendable 接口表示字元或字元序列可以被 append,接口定義如下:
Closeable 接口表示 Writer 可以被close,接口定義如下:
Flushable 接口表示 Writer 可以被flush,接口定義如下:
writeBuffer 是一個 char[] 類型,表示寫緩沖。
WRITE_BUFFER_SIZE 寫緩沖的大小。
lock 是 Writer 的鎖,用于實作同步。
有兩種構造方法,不帶參數時則将自己作為鎖,而如果傳入了某個 Object 對象則将其作為鎖。
一共有五個 write 方法,其中有一個抽象的 write 方法,可以看到所有 write 方法最終都會調用這個抽象方法,提供給子類處理邏輯的實作。它傳入的三個參數,字元數組cbuf、偏移量off和數組長度。
寫入一個 int 類型值時,先通過鎖進行同步,再判斷 writeBuffer 為 null 則要執行個體化一個對象,接着将 int 值轉成char類型,最後調用抽象 write 方法執行子類邏輯。
寫入 char 數組是則直接調用抽象 write 方法。
寫入 String 類型資料也有類似的處理,同樣是先加鎖,再執行個體化一個 char 數組用于存放寫入資料,這裡不同的地方在于要根據 String 資料的長度處理,如果小于 WRITE_BUFFER_SIZE 則直接使用 Writer 裡面的 writeBuffer 對象,而如果大于 WRITE_BUFFER_SIZE 則需要按照String資料的長度 new 一個 char 數組,但為了節約記憶體,這個較大的數組使用過後即會被 gc 掉,不必跟着 Writer 的生命周期一直存在。
一共有3個append方法,該方法是 Appendable 接口規定的方法,在實作中其實就是間接調用 write 方法進行寫入操作,但不同的是它傳回了 this,這樣就可以友善地使用 append(“xxx”).append(“yyy”)。
它是一個抽象方法,留給子類實作。此方法用于重新整理流,如果 Writer 的緩沖區包含任何字元則馬上将其寫入目的地。但如果目的地是另外一個流,則繼續調用其 flush 方法重新整理,是以調用 flush 會重新整理 Writer 鍊的所有緩沖。
此外,如果寫入目的地建立在作業系統之上,比如作業系統的檔案系統,那麼 flush 隻保證将緩沖寫入作業系統中,而不保證其寫入硬碟等實體裝置中。
它是一個抽象方法,留給子類實作。此方法用于關閉流,關閉之前要先執行 flush 将緩沖刷入目的地。如果某個流已經關閉了還調用 write 或 flush 方法,則将抛出 IOException 。
以下是廣告和相關閱讀
========廣告時間========
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321">為什麼寫《Tomcat核心設計剖析》</a>
=========================
相關閱讀:
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/73743876">從JDK源碼角度看Object</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/78026810">從JDK源碼角度看Long</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/77196626">從JDK源碼角度看Integer</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/78183273">從JDK源碼角度看Float</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/77941129">volatile足以保證資料同步嗎</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/72933108">談談Java基礎資料類型</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51455094">從JDK源碼角度看并發鎖的優化</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51468764">從JDK源碼角度看線程的阻塞和喚醒</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51433204">從JDK源碼角度看并發競争的逾時</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51397266">從JDK源碼角度看java并發線程的中斷</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51371416">從JDK源碼角度看Java并發的公平性</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51360228">從JDK源碼角度看java并發的原子性如何保證</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74557125">從JDK源碼角度看Byte</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/73350488">從JDK源碼角度看Boolean</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/76557578">從JDK源碼角度看Short</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/78246035">從JDK源碼看System.exit</a>
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/78315757">從JDK源碼看關閉鈎子</a>
歡迎關注:
