Java I/O原理

基本概念:

·I/O(Input/Output):一切的輸入輸出

·數據源(Data Source)

·數據宿(Data Sink):數據目的地

 

·Java中把不同的數據源與程序間的數據傳輸都抽象表述爲“流”(Stream),java.io包中定義了多種I/O流類型實現數據I/O功能。

 

·I/O流分類:

流動方向:輸入流(Input Stream)和輸出流(Output Stream)

關聯情況:節點流(Node Stream)和處理流(Processing Stream)

傳輸數據的顆粒大小:字符流(Character Stream)和字節流(Byte Stream)

 

 

·輸入流只能從中讀取數據,而不能向其寫出數據;

·輸出流則只能向其寫出數據,而不能從中讀取數據;

·特例:java.io.RandomAccessFile類是可讀可寫的。

 

 

·節點流直接連接到數據源;可以直接讀或者寫

·處理流是對一個已存在的流的連接和封裝,通過對所封裝的流的功能調用實現增強的數據讀寫功能,處理流並不直接連接到數據源。

 

 

·字節流以字節爲單位進行數據傳輸,每次傳送一個或多個字節;

·字符流以字符爲單位進行數據傳輸,每次傳送一個或多個字符;

·Java命名慣例:

  凡是以InputStream或OutputStream結尾的類型均爲字節流,凡是以Reader或Writer結尾的均爲字符流。

 

 

基礎I/O流類型:

 

·InputStream:

      java.io.InputStream是所有字節輸入流類型的父類,其中定義了以字節爲單位讀取數據的基本方法,並在其子類中進行了分化和實現。

·三個基本的read方法:

int read()

int read(byte[] buffer)

int read(byte[] buffer,int offset, int length)//讀取

·其他方法:

void close()

int available() //返回後面還有多少字節可以訪問

skip(long  n) //丟棄當前輸入流的n個字節

boolean markSupported() //判斷是否支持可標記

void mark(int readlimit) //做標記

void reset() //跳轉到標記

 

 

·OutputStream:

      java.io.OutputStream是所有字節輸出流類型的抽象父類。

三個基本的write方法:

void write(int c) //將參數c指定的位置寫出

void write(byte[] buffer) //依次寫出

void write(byte[] buffer,int offset, int length) //寫length個字節寫出到輸出流中去

其他方法:

void close()

void flush() //清空緩衝區

 

 

·Reader:

    java.io.Reader抽象類是所有字符輸入流類型的父類,其中聲明瞭用於讀取字符流的有關方法。

三個基本的read()方法:

int read() //讀取當前對象所關聯的輸入流的

int read(char[] cbuf) //每次從關聯數據源中讀取到cbuf中

int read(char[] cbuf,int offset,int length) //實際讀取的長度返回到int

其他方法:

void close()

boolean ready() //判斷當期輸入流類型是否準備就緒

skip(long n) //跳過當前位置後的

boolean markSupported()

void mark(int readAheadLimit)

void reset()

 

 

·Writer:

    java.io.Writer是所有字符輸出流類型的共同父類。

·五個基本的write方法:

void write(int c)

void write(char[] cbuf)

void write(char[] cbuf,int offset,int length) //offset開始的

void write(String string)

void write(String string,int offset,int length)

其他方法:

void close()

void flush()

 

 

·常用I/O流類型:

FileInputStream / FileOutputStream:

·FileInputStream用於讀取本地文件中字節數據,FileOutputStream用於將字節數據寫出到文件。

 

 

FileReader/FileWriter

·FileReader用於以字符爲單位讀取文本文件,FileWriter類用於將字符數據寫出到文本文件中。

BufferedReader/BufferedWriter

·BufferedReader用於緩衝讀取字符,BufferedWriter則提供字符的緩衝寫出功能。

 

 

錯誤日誌的編寫:可以利用標準輸出的重定向來實現自動寫入錯誤日誌。

屬性信息的保存:可以利用導出系統屬性和導入系統屬性來實現。

 

 

·對象序列化:

寫出對象的狀態信息,並遍歷該對象對其他對象的引用,遞歸的序列化所有被引用到的其他對象,從而建立一個完整的序列化流。

 

·對象的持久性(Object Persistance):長久保存一個對象的狀態並在需要時獲取該對象的信息,以重新構造一個狀態完全相同的對象。

·對象序列化(Object Serizalization):通過寫出對象的狀態數據來記錄一個對象。

 

·要實現對象序列化必須實現以下兩種接口之一:

java.io.Serializable

java.io.Externalizable

 

·java.io.ObjectOutputStream/ObjectInputStream類分別提供了對象的序列化和反序列化功能。以對象的方式進行傳輸和存儲。

 

·對象序列化過程中的數據保護:在對象序列化過程中,其所屬類的static屬性和方法代碼不會被序列化處理。

對於個別不希望被序列化的非static屬性,可以在屬性聲明時使用transient關鍵字進行標明。

private tansient int name;

 

NIO:

new IO機制,出現在1.4版本以後,以塊的形式來傳輸數據。

NIO能夠對數據進行打包傳輸。

NIO基礎:

·緩衝區(Buffer):所有數據都必須通過緩衝區,緩衝區滿後再作爲塊傳輸;

·通道(Channel):可以實現數據的讀入和寫出操作,雙向的。很底層。要通過緩衝區才能讀取和寫入,不能直接寫入讀出。

·字符集轉換(Charset):不同字符集的轉換,以Unicode爲主要橋樑。

高級NIO技術:

·子緩衝區和數據共享:空間中的視圖

·只讀緩衝區

·內存映射文件:直接把文件映射到內存的數組中(危險)

·文件鎖定:不想與別人共享文件,獨佔鎖定。

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