基本概念:
·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技術:
·子緩衝區和數據共享:空間中的視圖
·只讀緩衝區
·內存映射文件:直接把文件映射到內存的數組中(危險)
·文件鎖定:不想與別人共享文件,獨佔鎖定。