資料流(Stream)是指資料通信的通道。
Java程式中對資料的輸入、輸出操作是以流的方式進行的,JDK又提供了各種流類,來擷取不同種類的的資料。
流的分類:
按流向分
·輸入流:從檔案、網絡、記憶體等(資料源)到程式中,是read的過程,是input的過程,處理這樣事物的流,是輸入流。
·輸出流:從程式到檔案,網絡,記憶體等,是寫的過程這樣的流是輸出流。
按傳輸的機關:
·位元組流:以位元組為傳輸的機關。8bit = 1byte 處理二進制檔案,包括mp3,jpg,exe,doc,ppt,pdf...Java中以Stream結尾的流都是位元組流。
·字元流:以字元為傳輸的機關。以reader結尾的流是輸入字元流,以writer結尾的流是輸出字元流。
按功能(層次):
·節點流:用于直接操作目标裝置的流。
·處理流:對一個已存在的流的連接配接和封裝,通過對資料的處理為程式提供更為強大,靈活的讀寫功能。
JDK提供的相關類:InputStream、OutStream、Reader、Writer。四個都是抽象類。
位元組流
字元流
輸入流
InputStrean
Reader
輸出流
OutputStream
Writer
可以這樣了解類中含有Stream的是位元組流,含有Reader、Writer的是字元流,帶有Input、Reader的是輸入流,帶有Output、Writer的是輸出流。
InputStream:繼承此類的流都是輸入流。資料讀取的機關是一個位元組(8位)。
public abstractint read() throws IOException:從輸入流中讀取資料的下一個位元組。讀到末尾傳回-1;
public intread(byte[] b) throws IOException:從輸入流中讀取b.length 個位元組的資料并存儲到緩沖區數組b中.傳回的是實際讀到的位元組總數。
public voidclose() throws IOException:關閉此輸入流并釋放與此流關聯的所有系統資源。
OutputStream:繼承此類的都是輸出流,資料機關是位元組(8位)。
public abstractvoid write(int b) throws IOException:将指定的位元組寫入此輸出流
public voidwrite(byte[] b) throws IOException:将 b.length個位元組從指定的 byte 數組寫入此輸出流
public voidflush() throws IOException:重新整理此輸出流并強制寫出所有緩沖的輸出位元組。如果輸出的,要立即看到結果。需要使用此方法,因為在輸出流沒有關閉前,不一定寫到檔案。
pulbic voidclose() throws IOException:關閉此輸出流并釋放與此流有關的所有系統資源(含重新整理操作)。
Wiriter:繼承此類的都是輸出字元流,且字元的機關是字元(16位)。
public voidwrite(int c) throws IOException
寫入單個字元
public voidwrite(char[] cbuf) throws IOException
寫入字元數組
public voidwrite(String str) throws IOException:寫出字元串到關聯的資料源中去
public abstractvoid close() throws IOException:關閉此流,但要先重新整理它
public abstract voidflush() throws IOException:重新整理該流的緩沖,将緩沖的資料全寫到目的地。
Reader:繼承此類的流大多是輸入字元流。機關是字元。
常用的方法:
abstract int read(char[] buf, int offset, int count):讀取指定字元偏移量offset最多count個到buf的字元數組中。
I/O流之節點流
節點流分為檔案流、記憶體流、管道流。
檔案流主要用來操作檔案,主要以FileXxx的類,是檔案流。比如FileInputStream、FileOutputStream、FileReader、FileWriter。
記憶體流主要用來操作記憶體的。ByteArrayInputStream 和 ByteArrayOutputStream 。
處理流又稱過濾流。緩沖流:提高資料流的讀寫效率。
節點流又分為檔案流和記憶體流。
檔案流主要類有FileInputStream,FileOutputStream,FileReader,FileWriter。
記憶體流主要用來操作記憶體,ByteArrayInputStream(記憶體輸入流,主要完成将内容從記憶體讀入程式之中)和ByteArrayOutputStream(記憶體輸出流,主要是将資料寫入到記憶體中)。ByteArrayOutputStream類中有一個方法toByteArray(),可以将剛寫入到記憶體中的資料流,傳回一個byte類型的位元組數組。
處理流又稱過濾流,大緻可以分為緩沖流,Object流,列印流,轉換流,資料流。
緩沖流是處理流的一種,建立在相應的節點流之上,對讀寫的資料提供了緩沖的功能,提高了讀寫的效率,還增加了一些新的方法。相關的類有
1. BufferedInputStream 可以對任何的InputStream流進行包裝。
2. BufferedOutputStream 可以對任何的OutputStream流進行包裝。
3. BufferedReader 可以對任何的Reader流進行包裝。新增了readLine()方法用于一次讀取一行字元串(以‘\r’或‘\n’認為一行結束)傳回一行如果沒有傳回null。
4. BufferedWriter 可以對任何的Writer流進行包裝,新增了newLine()方法用于寫入一個行分隔符。
對于緩沖輸出流,寫出的資料會先緩存在記憶體緩沖區中,關閉此流前要用flush()方法将緩存區的資料立刻寫出。關閉過濾流時,會自動關閉過濾流所包裝的所有底層流。
Object流(對象流):JDK提供的ObjectOutputStream 和ObjectInputStream 類是用于存儲和讀取基本資料類型或對象的過濾流。
1. 用ObjectOutputStream類儲存基本資料類型或對象的機制叫序列化。
2. 用ObjectInputStream類讀取基本資料類型或對象的機制叫反序列化。
能被序列化的對象所對應的類必須實作java.io.Serializable這個辨別性接口
列印流:PrintStream和PrintWriter都屬于輸出流,分别針對位元組和字元。PrintStream和PrintWriter類都提供了一系列重載的print和println方法來輸出各種類型的資料。
轉換流:在IO包中,實際上就是分為位元組流和字元流,但是除了這兩個流之外,還存在了一組位元組流-字元流的轉換流。轉換流用于在位元組流和字元流之間轉換。
JDK提供了兩種轉換流:
A. InputStreamReader:是Reader的子類,将輸入的位元組流變為字元流,即:将一個位元組流的輸入對象變為字元流的輸入對象。InputStreamReader需要和InputStream“套接”,它可以将位元組流中讀入的位元組解碼成字元。
B. OutputStreamWriter:是Writer的子類,将輸出的字元流變為位元組流,即:将一個字元流的輸出對象變為位元組流的輸出對象。OutputStreamWriter需要和OutputStream“套接”,它可以将要寫入位元組流的字元編碼成位元組。
資料流:DataInputStream和DataOutputStream。要注意,讀寫字元串的方法readUTF()和writeUTF();
在衆多的流操作中,各種流之間要結合使用,同時也要注意讀取和寫入效率,比如:在讀取或者寫入的檔案較大時,就要考慮使用緩沖流;或者定義一個緩沖位元組數組,提高流的操作效率。
還要注意,關閉流時,一定要考慮清楚,因為,關閉進階流會把相關的第一流關閉掉,這樣再對流進行操作,會出現異常。流一旦關閉,則同一個流無法再開啟。
本文轉自 墨宇hz 51CTO部落格,原文連結:http://blog.51cto.com/zzhhz/1628960