1、背景
      當前這個 海量資料時代,資料在網路中隨處流動,流動的過程都涉及I/O問題,可以說大部分web應用系統的瓶頸都是I/O瓶頸。
2、i/o是什麼
     1】 是input和output的簡寫,i/o操作主要是指使用java進行輸入輸出操作,java所有的i/o機制都是基於資料流進行輸入輸出的,這些資料流表示了字元或者位元組資料的流動序列。
      2】資料流是一串連續不斷的資料集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段、一段地向資料流管道中寫入資料,這些資料段會按先後順序形成一個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以讀取其中的任意長度的資料,但只能先讀取前面的資料後,再讀取後面的資料。不管寫入時是將資料分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。
      3】資料流:一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。
     
        4] 輸入流(Input Stream):
      程式從輸入流讀取資料來源。資料來源包括外界(鍵盤、檔案、網路…),即是將資料來源讀入到程式的通訊通道
     
        5] 輸出流:
      程式向輸出流寫入資料。將程式中的資料輸出到外界(顯示器、印表機、檔案、網路…)的通訊通道。
     
        5]目的:
       採用資料流的目的就是使得輸出輸入獨立於裝置。 
        Input Stream不關心資料來源來自何種裝置(鍵盤,檔案,網路) Output Stream不關心資料的目的是何種裝置(鍵盤,檔案,網路)
3、java的i/o類庫的基本架構
     1】大約80個類,可以分為以下4種
         1.基於位元組操作的i/o介面,inputStream和outputStream。
         2.基於字元操作的i/o介面,writer和Reader
         3.基於磁碟操作的i/o介面,File
         4.基於網路的i/o介面,socket(不在io包下)
       前兩種主要是傳輸的資料格式,後兩種是傳輸的格式
        2】基於位元組的i/o介面
           1.inputStream和outputStream根據資料型別分成若干個子類,
            
            ps:(1)操作資料得方式是可以組合使用的,如:
OutPutSream out= new BufferedOutputStream(new BufferedInputStream(new FileOutputStream("fileName")));
                   (2)必須要指定流最終寫到什麼地方,要麼是磁碟要麼是網路,區別是寫到網路還要先讓底層作業系統再將資料傳送到其他地方而不是本地磁碟。
          3】基於字元的i/o介面
                1、不管是磁碟還是網路傳輸,最小的儲存單元都是位元組,而不是位元組,所以i/o操作的都是位元組而不是字元。
                2、之所以有操作字元的介面,是因為我們程式中通常操作的都是字元形式,為了方便操作而提供而已。從字元到位元組要轉碼,這也是為什麼經常出現亂碼的問題。
                3、層次結構如下
               4、位元組與字元的轉化介面:資料得持久化或網路傳輸都是以位元組進行的,所以必須要有從字元到位元組或者位元組到字元的轉化。轉化過程如下:
                 
//FileReader繼承了InputStreamReader類,實際上是讀取檔案流,然後通過StreamDecoder解碼成char(StreamEnCoder則是從字元編碼位元組)。
StringBuffer str=new StringBuffer();
        char[] buf=new char[1024];
        FileReader f=new FileReader("file");
        while (f.read(buf)>0){
            str.append(buf);
        }
        str.toString();