java之I/O流

數據流(Stream)是指數據通訊的通道。java

      Java程序中對數據的輸入、輸出操做是以流的方式進行的,JDK又提供了各類流類,來獲取不一樣種類的的數據。數組

      流的分類:緩存

      按流向分網絡

           ·輸入流:從文件、網絡、內存等(數據源)到程序中,是read的過程,是input的過程,處理這樣事物的流,是輸入流。ide

           ·輸出流:從程序到文件,網絡,內存等,是寫的過程這樣的流是輸出流。編碼

      按傳輸的單位:spa

           ·字節流:以字節爲傳輸的單位。8bit = 1byte 處理二進制文件,包括mp3,jpg,exe,doc,ppt,pdf...Java中以Stream結尾的流都是字節流。對象

           ·字符流:以字符爲傳輸的單位。以reader結尾的流是輸入字符流,以writer結尾的流是輸出字符流。繼承

      按功能(層次):接口

           ·節點流:用於直接操做目標設備的流。

           ·處理流:對一個已存在的流的鏈接和封裝,經過對數據的處理爲程序提供更爲強大,靈活的讀寫功能。

JDK提供的相關類:InputStreamOutStreamReaderWriter。四個都是抽象類。


字節流

字符流

輸入流

InputStrean

Reader

輸出流

OutputStream

Writer

    能夠這樣理解類中含有Stream的是字節流,含有ReaderWriter的是字符流,帶有InputReader的是輸入流,帶有OutputWriter的是輸出流。

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的類,是文件流。好比FileInputStreamFileOutputStreamFileReaderFileWriter

      內存流主要用來操做內存的。ByteArrayInputStream 和 ByteArrayOutputStream 

處理流又稱過濾流。緩衝流:提升數據流的讀寫效率。

節點流又分爲文件流和內存流。

文件流主要類有FileInputStreamFileOutputStreamFileReaderFileWriter

內存流主要用來操做內存,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這個標識性接口

打印流:PrintStreamPrintWriter都屬於輸出流,分別針對字節和字符。PrintStreamPrintWriter類都提供了一系列重載的printprintln方法來輸出各類類型的數據。

轉換流:在IO包中,實際上就是分爲字節流和字符流,可是除了這兩個流以外,還存在了一組字節流-字符流的轉換流。轉換流用於在字節流和字符流之間轉換。

JDK提供了兩種轉換流:

A.  InputStreamReader:是Reader的子類,將輸入的字節流變爲字符流,即:將一個字節流的輸入對象變爲字符流的輸入對象。InputStreamReader須要和InputStream「套接」,它能夠將字節流中讀入的字節解碼成字符。

B.  OutputStreamWriter:是Writer的子類,將輸出的字符流變爲字節流,即:將一個字符流的輸出對象變爲字節流的輸出對象。OutputStreamWriter須要和OutputStream「套接」,它能夠將要寫入字節流的字符編碼成字節。

數據流:DataInputStreamDataOutputStream。要注意,讀寫字符串的方法readUTF()writeUTF();

在衆多的流操做中,各類流之間要結合使用,同時也要注意讀取和寫入效率,好比:在讀取或者寫入的文件較大時,就要考慮使用緩衝流;或者定義一個緩衝字節數組,提升流的操做效率。

還要注意,關閉流時,必定要考慮清楚,由於,關閉高級流會把相關的第一流關閉掉,這樣再對流進行操做,會出現異常。流一旦關閉,則同一個流沒法再開啓。

相關文章
相關標籤/搜索