天天看點

java之I/O流

資料流(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

上一篇: configure詳解
下一篇: I/O輸入輸出