功能簡介
PrintWriter 向文本輸出流打印對象的格式化表示形式
他與PrintStream的邏輯上功能目的是相同的--他們都想作同一件事情--更便捷的格式化打印輸出
PrintWriter實現了PrintStream 中的全部 print 方法,除了那些用於寫入原始字節的方法,對於那些字節,程序應該使用未編碼的字節流進行寫入 |
PrintStream會在換行符時自動調用自動刷新
PrintWriter在這一點上與PrintWriter不一樣,
只有在調用 println、printf 或 format 的其中一個方法時纔可能完成此操做
|
相似,PrintStream 此類中的方法不會拋出 I/O 異常,能夠經過 checkError() 檢查是否出現錯誤 |
PrintWriter也是裝飾器模式 只不過看起來沒那麼典型而已 他直接繼承Writer 省略了抽象裝飾器角色Decorator PrintWriter 既充當了Decorator也是一個ConcreteDecorator 它內部包含了一個Writer out |
|
構造方法
他內部有一個Writer out ,並且剛纔咱們已經說了他是裝飾器模式
因此他必然會須要一個out,你從構造方法的實際狀況也能夠看得出來
構造方法主要內容包括下面三部分:
1. 首先須要一個Writer
2. 自動刷新的標誌
3. 字符編碼的設置
|
對於一個Writer
1. 他要麼就是一個直接的Writer
2. 要麼是一個new OutputStreamWriter( OutputStream) 把OutputStream轉換爲Writer
3. 另外,經過File或者String路徑名,也能夠構造FileOutputStream ,他就是一個OutputStream,也就是下面的形式:
new OutputStreamWriter( new FileOutputStream(File/String路徑) )
|
自動刷新,若是不傳遞,默認false 編碼若是不設置,那麼是系統默認 |
最根本的構造方法是
![image_5b9b0ccf_47a0 image_5b9b0ccf_47a0](http://static.javashuo.com/static/loading.gif) |
最根本的爲何沒有字符編碼相關的? 其實, 還有一個私有的 私有的構造方法,將帶有字符編碼狀況的進行了二次的包裝 在建立 OutputStreamWriter時使用 私有的構造方法仍是繞回去到上面說的這個根本的構造方法去了
![image_5b9b0ccf_4548 image_5b9b0ccf_4548](http://static.javashuo.com/static/loading.gif) |
你會從構造方法中能夠看得出來 若是構造方法中指定了編碼 將會經由這個私有的構造方法轉發下
若是沒指定將會使用咱們上面說的那個最根本的形式
public PrintWriter(Writer out,
boolean autoFlush) {
|
不指定編碼的 所有都是使用PrintWriter(Writer out, boolean autoFlush)
![image_5b9b0ccf_1287 image_5b9b0ccf_1287](http://static.javashuo.com/static/loading.gif) |
帶編碼的藉助於私有構造方法進行請求轉發 private PrintWriter(Charset charset, File file)
![image_5b9b0ccf_2318 image_5b9b0ccf_2318](http://static.javashuo.com/static/loading.gif) |
說了那麼多,其實也只仍是須要記住下面這一個就行了 PrintWriter(Writer out, boolean autoFlush) 只有File參數或者String路徑參數 纔會設置編碼的參數, 若是設置了編碼的參數的話,將會在把他們轉換爲Writer時, 也就是 new OutputStreamWriter 中經過指定編碼參數構造 |
Write方法
write方法的本質仍是將數據寫入到輸出流 提供了5個版本的write |
void write(char[] buf)
將字符數組 寫入
void write(char[] buf, int off, int len)
將字符數組的某一部分 寫入
void write(int c)
將單個字符 寫入
void write(String s)
將字符串 寫入
void write(String s, int off, int len)
將字符串的某一部分 寫入
|
三個基礎方法,兩個簡化版方法
看得出來,相似PrintStream PrintWriter 也
不會拋出IOException異常
能夠經過
checkError
方法查看
trouble
的狀態
|
|
|
print(xxx) /println(xxx)
println() 經過寫入行分隔符字符串終止當前行。行分隔符字符串由系統屬性 line.separator 定義,不必定是單個換行符 ('\n')
|
print(boolean)
|
![image_5b9b0cd0_39e9 image_5b9b0cd0_39e9](http://static.javashuo.com/static/loading.gif) |
+ println() = println(boolean) |
print(char)
|
![image_5b9b0cd0_49f5 image_5b9b0cd0_49f5](http://static.javashuo.com/static/loading.gif) |
+ println() = println(char) |
print(int)
|
![image_5b9b0cd0_278d image_5b9b0cd0_278d](http://static.javashuo.com/static/loading.gif) |
+ println() = println(int) |
print(long)
|
![image_5b9b0cd0_72bd image_5b9b0cd0_72bd](http://static.javashuo.com/static/loading.gif) |
+ println() = println(long) |
print(float)
|
![image_5b9b0cd0_2f17 image_5b9b0cd0_2f17](http://static.javashuo.com/static/loading.gif) |
+ println() = println(float) |
print(double)
|
![image_5b9b0cd0_38b7 image_5b9b0cd0_38b7](http://static.javashuo.com/static/loading.gif) |
+ println() = println(double) |
print(char[])
|
![image_5b9b0cd0_567e image_5b9b0cd0_567e](http://static.javashuo.com/static/loading.gif) |
+ println() = println(char[]) |
print(String)
|
![image_5b9b0cd0_2925 image_5b9b0cd0_2925](http://static.javashuo.com/static/loading.gif) |
+ println() = println(String) |
print(Object) |
![image_5b9b0cd0_5968 image_5b9b0cd0_5968](http://static.javashuo.com/static/loading.gif) |
println(String.valueOf(Object))+ println() = println(Object) 稍微特殊,先轉換爲String String.valueOf(Object) 而後print(String)+ println() |
能夠看得出來 print系列都是調用的write方法 並且,基本上是write(String s)方法 boolean 會翻譯成 字符串 true 或者false,而後調用write String 若是是null 翻譯成字符串 null 而後調用write 除了Object略微特殊之外,其餘全部的print 和 println結合以後能夠產生對應的println(xxx)的形式 |
append
三個版本的append方法
append(char)
append(java.lang.CharSequence)
append(java.lang.CharSequence, int, int)
內部所有都是依賴於write方法
|
|
|
printf 與 format
PrintWriter內部也有一個Formatter
![image_5b9b0cd0_3ac3 image_5b9b0cd0_3ac3](http://static.javashuo.com/static/loading.gif) |
printf(java.util.Locale, java.lang.String, java.lang.Object...)
printf(java.lang.String, java.lang.Object...)
format(java.util.Locale, java.lang.String, java.lang.Object...)
format(java.lang.String, java.lang.Object...)
|
printf藉助於format format依賴Formatter
![image_5b9b0cd0_7395 image_5b9b0cd0_7395](http://static.javashuo.com/static/loading.gif) |
jdk1.8中 format方法與PrintStream 中幾乎同樣的,幾乎同樣的,幾乎同樣的.... |
PrintWriter提供了close以及flush方法 以下圖所示,依賴於內部out 的 close和flush 也沒什麼好說的 |
|
總結
PrintWriter 構造方法不少,提供出來的方法也不少,看起來讓人眼花繚亂
其實他就是一個裝飾工具類,底層邏輯也很簡單
既然是工具性質的
1. 天然須要有足夠便捷的構造形式,你看那麼多構造方法,最終不過也就是一種形式的構造方法
2. 天然有可以有多變的輸出形式纔可以說是便捷的輸出打印嘛
對於Writer家族的一些基本操做,基本上是沿用了Write
所謂的增長的便捷亮點各類print和println
也就只是使用Writer自己的write方法打印輸出他們的字符 形式
轉換爲字符的規則爲:
基本數據類型和Object 會使用String.valueOf進行轉換 |
字符 字符數組 String自己就是字符/字符串的形式 |
另外的一個亮點是printf 同PrintStream中的是同樣的,想要弄清楚重點在於弄清楚 Formatter了
上面說了,他既然是裝飾工具流,因此說他必然要依賴於其餘的輸出流
PrintWriter就是依賴Writer,他就是來給這個Writer增長更便捷的打印輸出功能的
既然着重點在於格式化輸出數據,那麼他的關注點天然在於數據的形式,而不是在於怎麼寫,因此write方法都幾乎不動使用的仍是原來的
而後在實際的調用各類print方法的時候,在對方法的入參進行轉換,換成了字符的形式而已