黑馬程式設計師Java培訓和Android培訓_IO(二)

chen_chg發表於2011-07-26

1.         字元編碼

Unicode編碼:

ISO將全世界所有的字元進行了統一的編碼,稱之為Unicode

“中”在全世界的任何一個角落,始終對應的都是一個十六進位制的數字4e2d

如果所有的計算機都使用Unicode編碼,在中國的本地系統中顯示的“中這個字元”傳送到世界各地顯示的仍然是“中這個字元

Unicode只佔用兩個位元組,在全世界範圍內,表示的字元個數不會超過2的16次方,實際上,Unicode編碼中還保留了兩千個多個數值沒有用於字元編碼

在相當長的一段時間內,本地話字元將與Unicode共存

Java中的字元使用的都是Unicode編碼,java在通過Unicode保證跨平臺的特性前提下,也支援本地平臺的字符集

Utf-8編碼

ASCII碼字元保持原樣,仍然只佔用一個位元組,對於其他國家的字元,utf-8使用兩個或三個位元組來表示,使用UTF-8編碼的檔案,通常要用EFBB BF作為檔案開頭的三個位元組資料

2.         各種過濾與包裝類

(1).  過濾與包裝類

通過FileOutpuStream物件將一個浮點小數寫入到檔案中,是否有點困難?能否通過FileOutputStream物件直接將一個整數寫入到檔案呢?

假如有個DataOutputStream類中提供了各種輸出流物件寫入各種型別的資料(當然包括浮點小數)的方法。你現在所要做的工作就是:傳遞一個FileOutputStream輸出流物件給DataOutputStream例項物件呼叫DataOutputStream例項物件用於寫入浮點小數的方法。

DataOutputStream並沒有反應到任何具體的流裝置,一定要給它傳遞一個對應具體流裝置的輸出物件,完成類似DataOutputStream功能的類就是一個包裝類,也叫過濾流或處理流類

 

(2).BufferedInputStream與BufferedOutputStream類

緩衝流為I/O流增加了記憶體緩衝區,增加緩衝區有兩個基本目的:

允許java程式一次不止操作一個位元組,這樣提高了程式的效能。

由於有了緩衝區,使得在流上執行skip、mark和reset方法成為可能

BufferedInputStream與BufferedOutputStream是java提供的兩個緩衝區包裝類,不管底層系統是否使用了緩衝區,這兩個類在自己的例項物件中建立緩衝區,想想這種緩衝區底層系統提供的緩衝區區別。

BufferedIputStream的兩個建構函式

BufferedInputStream(InputStream in);

BufferedInputStream(IntpuStream inint size);

BufferedOutputStream的兩個建構函式

BufferedOutputStream(InputStream out);

BufferedOutputStream(OutpuStream out,int size);

 

(3)BufferedReader和BufferedWriter類

BufferedReader的readLine方法可以一次讀取一行文字,BufferedWriter的writeLine方法可以向不同的字元流中寫入不同作業系統下的換行符。

 

(4) DataInputStream與DataOutoutStream類

DataOutoutStreaml類提供了三個寫入字串的方法

Public finalvoid writeBytes(String s)

Public finalvoid writeChars(String s)

Public finalvoid writeUTF(String str)

為什麼DataInputStream類中有一個readUFT方法,而沒有“readBytes”和readChars方法

 

(5)PrintStream類

PrintStream類提供了一系列的print和println方法,可以將基本資料型別的資料格式化成字串。

格式化輸出是什麼意思呢?例如97的格式化輸出的實際位元組資料為0x39和0x37。

PrintStream類的三個建構函式

PrintStream(OutputStream out)

PrintStream(OutputStream out,boolean autoflush)

PrintStream(OutputStream out, booleanautoflush,String encoding)

PrintlnStream對應的PrintWrite類,即使遇到了文字換行識別符號(\n)Printwrite類也不會自動清空緩衝區。

PrintWriter的print能根據作業系統的不同生成相應的文字換行識別符號,在window下的文字標識換行符是“\r\n”在linux下是“\n”

 

(6)ObjectInputStream和ObjectOutputStream

ObjectInputStream和ObjectOutputStream這兩個包裝類用於底層輸入流中讀取型別物件的資料和將物件型別的資料寫入底層輸出流

ObjectInputStream和ObjectOutputStream所讀寫的物件必須實現Serializble介面,物件中的stransien和static型別的成員變數不會被讀取和寫入

Decorator設計模式

在程式中用一個物件(the Decorator)包裝另外的一個物件,稱之為Decorator模式。

    public static void main(String[] args) {

        try {

            throw new Exception("test");

        } catch (Exception e) {

            //字串和輸出流的橋樑StringWriter

            StringWriter sw = new StringWriter();

            //建立輸出流幷包裝writer物件

            PrintWriter pw = new PrintWriter(sw);

            //引數傳遞

            e.printStackTrace(pw);

            //列印異常的詳細資訊

            System.out.println(sw.toString());

        }

    }

相關文章