數據流(Stream)是指數據通訊的通道。java
Java程序中對數據的輸入、輸出操做是以流的方式進行的,JDK又提供了各類流類,來獲取不一樣種類的的數據。數組
流的分類:緩存
按流向分網絡
·輸入流:從文件、網絡、內存等(數據源)到程序中,是read的過程,是input的過程,處理這樣事物的流,是輸入流。ide
·輸出流:從程序到文件,網絡,內存等,是寫的過程這樣的流是輸出流。編碼
按傳輸的單位:spa
·字節流:以字節爲傳輸的單位。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();
在衆多的流操做中,各類流之間要結合使用,同時也要注意讀取和寫入效率,好比:在讀取或者寫入的文件較大時,就要考慮使用緩衝流;或者定義一個緩衝字節數組,提升流的操做效率。
還要注意,關閉流時,必定要考慮清楚,由於,關閉高級流會把相關的第一流關閉掉,這樣再對流進行操做,會出現異常。流一旦關閉,則同一個流沒法再開啓。