Java_IO流---打印流以及PrintStream和PrintWriter、DataOutputStreamr的區別

1、簡介
  • PrintStream 是打印輸出流,它繼承於FilterOutputStream。
  • PrintStream 是用來裝飾其它輸出流。它能爲其餘輸出流添加了功能,使它們可以方便地打印各類數據值表示形式。
  • PrintStream 永遠不會拋出 IOException。
  • PrintStream 提供了自動 flush 和 字符集設置功能。所謂自動flush,就是往PrintStream寫入的數據會馬上調用flush()函數。
2、異同:看完簡介,你是否以爲PrintStream與DataOutStream有幾分類似!
  • DataOutStream的異同java

    • 2.1 相同點程序員

      • 都是繼承與FileOutputStream,用於包裝其它輸出流。
    • 2.2 不一樣點數組

      • 2.2.1 編碼方面函數

        • PrintStreamDataOutputStream 均可以將數據格式化輸出;但它們在"輸出字符串"時的編碼不一樣。
          PrintStream是輸出時採用的是用戶指定的編碼(建立PrintStream時指定的),若沒有指定,採用系統默認的字符編碼,DataOutputStream則採用的是UTF-8
      • 2.2.2 異常處理機制方面編碼

        • DataOutputStream在經過write()向 「輸出流」 中寫入數據時,若產生IOException,會拋出。
        • PrintStream在經過write()向 「輸出流」 中寫入數據時,若產生IOException,則會在write()中進行捕獲處理;並設置 trouble 標記(用於表示產生了異常)爲true。用戶能夠經過checkError()返回 trouble 值,從而檢查輸出流中是否產生了異常。
      • 2.2.3 構造函數方面:code

        • DataOutputStream的構造函數只有一個:DataOutputStream(OutputStream out)。即它只支持以輸出流out做爲「DataOutputStream的輸出流」
        • PrintStream的構造函數有許多:(1)、一樣支持以輸出流out做爲「PrintStream輸出流」的構造函數;(2)、還支持以「File對象」或者「String類型的文件名對象」的構造函數;(3)、在PrintStream的構造函數中,能「指定字符集」和「是否支持自動 flush()操做
      • 2.2.4 目的方面對象

        • DataOutputStream的做用是裝飾其它的輸出流,它和DataInputStream配合使用:容許應用程序以與機器無關的方式從底層輸入流中讀寫java數據類型。
        • PrintStream的做用雖然也是裝飾其餘輸出流,可是它的目的不是以與機器無關的方式從底層讀寫java數據類型;而是爲其它輸出流提供打印各類數據值表示形式,使其它輸出流能方便的
  • PrintWriter的異同繼承

    • 相同點:字符串

      • PrintStreamPrintWriter的API幾乎相同,都能輸出各類形式的數據,構造方法也幾乎相同,PrintWriter多了個接受Writer參數
    • 區別:源碼

      • 輸出字符時的編碼方面

        • PrintStream在輸出字符,將字符轉換爲字節時採用的是系統默認的編碼格式,這樣當數據傳輸另外一個平臺,而另外一個平臺使用另一個編碼格式解碼時就會出現問題,存在不可控因素。
        • PrintWriter能夠在傳入Writer對象參數時,可由程序員指定字符轉換爲字節時的編碼格式,這樣兼容性和可控性會更好。

          OutputStreamWriter(OutputStream ops / Writer w, Charset cs);
      • 所屬體系方面

        • PrintStream屬於字節流體系,PrintWriter繼承於Writer,屬於字符流體系中

3、PrintStream的用法:(將字母「abcde」寫入到文件「data.txt」)
  • 使用說明:先看一下 數據文件的過程
  • 一、數據從流寫到文件**過程

    • 輸出流----->緩衝流----->轉化流----->文件流------>文件.
  • 二、數據從文件到流的過程

    • 文件----->文件流----->轉化流----->緩衝流----->輸入流.
  • 三、PrintStream流中基本全部的print(Object obj)重載方法都經過將對應數據先轉換成字符串, 而後調用write()方法寫到底層輸出流中.常見用到PrintStream流對象 System.out就被包裝成PrintStream流,System.err也是。
  • 四、此外爲了提升寫入文件的效率, 還可使用字符緩衝流BufferWriter
  • 3.一、PrintStream (OutputStream out)

    final byte[] arr = {0x61, 0x62, 0x63, 0x64, 0x65 }; //abced
                   
              File file = new File("file.txt");  // 建立文件「file.txt」的File對象
                   
              PrintStream out = new PrintStream( // 建立文件對應FileOutputStream
                   new FileOutputStream(file));
                   
              out.write(arr);     // 將「字節數組arr」所有寫入到輸出流中
              out.close();        // 關閉輸出流
  • 3.二、PrintStream (File file)

    final byte[] arr = {0x61, 0x62, 0x63, 0x64, 0x65 };
                  PrintStream out = new PrintStream ("data.txt");
                  out.write(arr);
                  out.close();
  • 3.三、PrintStream (OutputStream out)

    final byte[] arr = {0x61, 0x62, 0x63, 0x64, 0x65 };
              File file = new File("data.txt");  //建立文件「data.txt」的File對象
                   
              PrintStream out = new PrintStream( //建立文件對應FileOutputStream
                 new FileOutputStream(file));
                  
              out.write(arr);     // 將「字節數組arr」所有寫入到輸出流中
              out.close();        // 關閉輸出流
  • 3.四、write(), print(), println(), printf()

    PrintStream pS = new PrintStream("other.txt");
              
              pS.println("hello PrintStream");
              pS.write(0x41);    
              pS.print(0x41);    
              
              String str = "CDE";
              pS.printf("%s\n", str);
              文件內容以下:
                  hello PrintStream
                  A65BCDE
    • 附:爲何是有A65出現?write() 、以及print()重載版本之一的源碼以下

      write(int oneByte)
          對於write(0x41):  ---- 0x41的ACCII碼對應 A, 
      
          public void print(int i) {
              write(String.valueOf(i));
          }
          pS.print(0x41); == pS.write(String.valueOf(Ox41));
                                 String.valueOf(65) --> "65";
4、PrintWriter的用法
  • 構造函數 PrintWriter(OutputStream out / Writer w, boolean autoflush);-----所以在傳入Writer時,能夠配合轉換流 OutputStreamWriter(OutputStream ops, Charset cs);設定字符集

    PrintWriter printWriter = new PrintWriter(new
          OutputStreamWriter(System.out, "GB2312"));    
          //System.out是OutputStream一的對象
相關文章
相關標籤/搜索