PrintStream類和PrintWriter類

PrintStream主要操作byte流,而PrintWriter用來操作字符流。讀取文本文件時一般用後者。

java的一個字符(char)是16bit的,一個BYTE是8bit的
PrintStrean是寫入一串8bit的數據的。
PrintWriter是寫入一串16bit的數據的。
String缺省是用UNICODE編碼,是16bit的。因此用PrintWriter寫入的字符串,跨平臺性好一些吧。
PrintStream的可能會出現字符集亂碼吧。

PrintStream是用來操作byte,
PrintWriter是用來操作Unicode,
一般需要處理中文時用PrintWriter好了

Stream用於二進制文件(非文本)
Writer/Reader用於文本文件(雖然也是二進制,不過是按照一定的字符編碼規則,不像前者)
當然Stream也可用於文本,只不過比writer/reader來的麻煩

PrintStream主要操作byte流,而PrintWriter用來操作字符流。讀取文本文件時一般用後者。
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系列方法的場合,二者沒什麼區別。

         但是,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文檔中都有。
  PrintStream類是過濾器類中一個不可忽視的成員,最基本的標準輸出就要藉助於它——我們常用的System.out變量就是PrintStream實例。與之對應的字符流類是PrintWriter類。
  PrintStream有兩個構造函數(在新版API中已標記爲過時):
  ■public PrintStream(OutputStream out)
  ■public PrintStream(OutputStream out,boolean autoFlush)
其中,autoFlush置爲true時,每當輸出遇到換行符,緩衝區的內容就被強制全部輸出,如同調用了一次flush()。但要注意,如果沒遇到換行符,還是會有數據“憋”在緩衝區裏。
  方法(已熟悉的就不解釋):
  ■public void write(int b)
  ■public void write(byte b,int offset,int length)
  ■public void flush()
  ■public void close()
  ■public void print(Object obj)
  這個方法功能是 非常強大的,它可以輸出任何對象,而不必另加說明。此外print()方法有許多重載形式,即有多種參數。它們是字符串(String)、字符數組 (char[])、字符(char)、整數(int)、長整數(long)、浮點數(float)、雙精度浮點數(double)、布爾值 (boolean)。其中,輸出多個數單位的print()方法(也就是指參數爲String和char[]的)是同步(synchronized)方 法。
  ■public void println()輸出一個換行符。
  ■public synchronized void println(Object obj)
  println()方法有9個重載形式,幾乎就是print()方法的翻版。唯一的區別在於println()方法都是同步的。
  ■public boolean checkError()
  檢查輸出過程中有什麼錯誤,如有,返回true值。只要輸出流中出現一次錯誤,則出錯後的任意對checkError()的調用均會返回真值。
  下面介紹PrintWriter類。
  如同第二節中所說,PrintWriter是JDK1.1版增加了與字節流I/O相對應的字符流I/O。但是,爲了保持兼容性,原先的類幾乎沒有改 動。再加之調試的需要,PrintStream類被保留,並且System類中的成員變量out、err仍作爲它的對象。然而,PrintWriter用 於大多數輸出比PrintStream更爲合適。因此1.1版的API中建議新開發的代碼使用PrintWriter類,並將 PrintStream類的兩個構造函數標記爲過時。這樣,雖然使用System.out輸出不會產生問題,在程序中創建新的PrintStream對象 時卻會產生編譯時的警告。
  PrintWriter類與PrintStream類的方法是對應的。有一個不同之外需提請讀者注意,就是當前者的自動清空緩衝區的功能被使能時(構 造函數中autoFlush置爲true),僅當println()方法被調用時才自動清緩衝區,而不是像PrintStream一樣遇到一個換行符就清 緩衝。

PrintStream,它可以將Java的基本資料型態等資料,直接轉換爲系統預設編碼下對應的字元,再輸出至OutputStream中,而這邊要介 紹的 PrintWriter其功能上與PrintStream類似,除了接受OutputStream之外,它還可以接受Writer物件作爲輸出的對象,當 您原先是使用Writer物件在作處理 ,而現在想要套用println()之類的方法時,使用PrintWriter會是比較方便的作法。

下面這個程式顯示了PrintStream與PrintWriter兩個物件在處理相同輸出目的時的作法,程式將會在熒幕上顯示 "簡體中文" 四個字元:

StreamWriterDemo.java
package onlyfun.caterpillar; import java.io.*;
public class StreamWriterDemo
{

public static void main(String[] args)  {

try  {

byte[] sim = {(byte)0xbc, (byte)0xf2, // 簡
(byte)0xcc, (byte)0xe5, // 體
(byte)0xd6, (byte)0xd0, // 中
(byte)0xce, (byte)0xc4}; // 文
InputStreamReader inputStreamReader = new InputStreamReader(new ByteArrayInputStream(sim), "GB2312");
PrintWriter printWriter =new PrintWriter(new OutputStreamWriter(System.out, "GB2312"));
PrintStream printStream =new PrintStream(System.out, true, "GB2312");
int in;
while((in = inputStreamReader.read()) != -1)  {

printWriter.println((char)in);

printStream.println((char)in);

}
inputStreamReader.close();
printWriter.close();
printStream.close();

}
catch(ArrayIndexOutOfBoundsException e)  {

e.printStackTrace();

}
catch(IOException e) {

e.printStackTrace();

}

}

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