JAVA I/O流

原文:http://blog.csdn.net/zzp_403184692/article/details/8057693

今天剛剛看完Java的io流操作,把主要的脈絡看了一遍,不能保證以後使用時都能得心應手,但是最起碼用到時知道有這麼一個功能可以實現,下面對學習進行一下簡單的總結:
IO流主要用於硬板、內存、鍵盤等處理設備上得數據操作,根據處理數據的數據類型的不同可以分爲:字節流(抽象基類爲InPutStream和OutPutStream)和字符流(抽象基類爲Reader和Writer)。根據流向不同,可以分爲:輸入流和輸出流。 其中主要結構可以用下圖來表示:
這裏寫圖片描述

字符流和字節流的主要區別:
1.字節流讀取的時候,讀到一個字節就返回一個字節; 字符流使用了字節流讀到一個或多個字節(中文對應的字節數是兩個,在UTF-8碼錶中是3個字節)時。先去查指定的編碼表,將查到的字符返回。
2.字節流可以處理所有類型數據,如:圖片,MP3,AVI視頻文件,而字符流只能處理字符數據。只要是處理純文本數據,就要優先考慮使用字符流,除此之外都用字節流。

IO流主要可以分爲節點流和處理流兩大類。

一、節點流類型
該類型可以從或者向一個特定的地點或者節點讀寫數據。主要類型如下:
這裏寫圖片描述
二、處理流類型
該類型是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫,處理流的構造方法總是要帶一個其他流對象作爲參數,一個流對象進過其他流的多次包裝,叫做流的鏈接。主要可以分爲以下幾種:

1、緩衝流(BufferedInPutStream/BufferedOutPutStream和BufferedWriter/BufferedReader)他可以提高對流的操作效率。
寫入緩衝區對象:

 BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));

讀取緩衝區對象:

BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));

該類型的流有一個特有的方法:readLine();一次讀一行,到行標記時,將行標記之前的字符數據作爲字符串返回,當讀到末尾時,返回null,其原理還是與緩衝區關聯的流對象的read方法,只不過每一次讀取到一個字符,先不進行具體操作,先進行臨時儲存,當讀取到回車標記時,將臨時容器中儲存的數據一次性返回。

2、轉換流(InputStreamReader/OutputStreamWriter)
該類型時字節流和字符流之間的橋樑,該流對象中可以對讀取到的字節數據進行指定編碼的編碼轉換。
構造函數主要有:

    InputStreamReader(InputStream);        //通過構造函數初始化,使用的是本系統默認的編碼表GBK。
     InputStreamWriter(InputStream,String charSet);   //通過該構造函數初始化,可以指定編碼表。
     OutputStreamWriter(OutputStream);      //通過該構造函數初始化,使用的是本系統默認的編碼表GBK。
     OutputStreamwriter(OutputStream,String charSet);   //通過該構造函數初始化,可以指定編碼表。

注意:在使用FileReader操作文本數據時,該對象使用的時默認的編碼表,即
FileReader fr=new FileReader(“a.txt”); 與 InputStreamReader isr=new InputStreamReader(new FileInputStream(“a.txt”)); 的意義相同。如果要使用指定表編碼表時,必須使用轉換流,即如果a.txt中的文件中的字符數據是通過utf-8的形式編碼,那麼在讀取時,就必須指定編碼表,那麼轉換流時必須的。即:
InputStreamReader isr=new InputStreamReader(new FileInputStream(“a.txt”),utf-8);

3、數據流(DataInputStream/DataOutputStream)
該數據流可以方便地對一些基本類型數據進行直接的存儲和讀取,不需要再進一步進行轉換,通常只要操作基本數據類型的數據,就需要通過DataStream進行包裝。
構造方法:

 DataInputStreamReader(InputStream);
  DataInputStreamWriter(OutputStream);

方法舉例:

   int readInt()//一次讀取四個字節,並將其轉成int值
   writeInt(int)//一次寫入四個字節,注意和write(int)不同,write(int)只將該整數的最低一個8位寫入,剩餘三個8爲丟失
   hort readShort();
   writeShort(short);
   String readUTF();//按照utf-8修改版讀取字符,注意,它只能讀writeUTF()寫入的字符數據。
    writeUTF(String);//按照utf-8修改版將字符數據進行存儲,只能通過readUTF讀取。

注意:在使用數據流讀/存數據的時候,需要有一定的順序,即某個類型的數據先寫入就必須先讀出,服從先進先出的原則。

4、打印流(PrintStream/PrintWriter)
PrintStream是一個字節打印流,System.out對應的類型就是PrintStream,它的構造函數可以接受三種數據類型的值:1.字符串路徑。2.File對象 3.OutputStream
PrintStream是一個字符打印流,它的構造函數可以接受四種類型的值:1.字符串路徑。2.File對象 3.OutputStream 4.Writer 對於1、2類型的數據,可以指定編碼表,也就是字符集,對於3、4類型的數據,可以指定自動刷新,當該自動刷新爲True時,只有3個方法可以用:println,printf,format。

5、對象流(ObjectInputStream/ObjectOutputStream)
該類型的流可以把類作爲一個整體進行存取,主要方法有:
Object readObject();該方法拋出異常:ClassNotFountException。
void writeObject(Object):被寫入的對象必須實現一個接口:Serializable,否則就會拋出:NotSerializableException

發佈了9 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章