java 輸出流中的PrintStream 和 PrintWriter有什麼區別,好像不少場合都能混用
好比用於網絡間通訊,發送消息時,可用PrintStream 也可用 PrintWriter
eg:
Socket client;
PrintStream output = new PrintStream(client.getOutputStream());
output.println("aaa");
output.flush();
把上例中的 PrintStream 換成 PrintWriter效果是同樣的。Java I/O流分爲兩類,字節流和字符流。字節流是指InputStream/OutputStream及其子類,字符流是指Reader/Writer及其子類。這兩類I/O流的class hierarchy基本上是對等的,InputStreamReader/OutputStreamWriter是InputStream/OutputStream和Reader/Writer之間的橋樑。
PrintStream是OutputStream的子類,PrintWriter是Writer的子類,二者處於對等的位置上,因此它們的API是很是類似的。PrintWriter實現了PritnStream的全部print方法。對於PrintStream,全部println方法都在內部調用相應的print方法,好比println(char x)的方法體就是調用print(x);再寫入一個平臺相關的換行符。PrintStream構建時會在內部new一個BufferedWriter,全部print方法都在內部調用這個Writer的write方法(write(String)或write(char[]))——對於print(char[]),直接調用write(char[]);對於其餘的print方法,先用String.valueOf得到參數的字符串表示,而後調用write(String)。
對於PrintWriter,全部println方法也都在內部調用print方法,print方法調用write方法。傳入OutputStream時,PrintWriter會在內部構造一個BufferedWriter;而傳入Writer時,PrintStream內部直接使用該Writer,此時PrintWriter是否進行了緩衝全看該Writer。
因此,對於使用print系列方法的場合,兩者沒什麼區別。java
可是,PrintStream是字節流,它有處理raw byte的方法,write(int)和write(byte[],int,int);PrintWriter是字符流,它沒有處理raw byte的方法。PrintStream和PrintWriter的auto flushing機制有點不一樣,前者在輸出byte數組、調用println方法、輸出換行符或者byte值10(即\n)時自動調用flush方法,後者僅在調用println方法時發生auto flushing。
System.out是PrintStream。其實這些東西API文檔中都有。數組