流是字節的序列的抽象概念,數據流向,主要用於硬盤、內存、IO設備上的數據操作。
Java流分爲三類:
1.按照處理數據大小:字節流和字符流
2.按照流的方向:輸入流和輸出流
3.按照功能分爲:節點流和處理流
字節流和字符流:
1)字節流 : 讀取數據的最小單位是字節,8bit,有兩個抽象基類InputStream/OutputStream,可以處理設備上的所有類型數據。
2)字符流:讀取數據的最小單位是字符,原理是基於字節流讀取字節後查詢指定編碼表,返回對應字符,有兩個抽象基類Reader/Writer,只能處理文本類型數據。
InputStream中常見的方法:
–int read()
讀取一個字節,返回值爲所讀得字節
–int read(byte b[])
讀取多個字節,放置到字節數組b中,通常讀取的字節數量爲b的長度,返回值爲實際獨取的字節的數量。
–int read(byte b[] ,int off,int len)
讀取len個字節,放置到以下標off開始字節數組b中,返回值爲實際讀取的字節的數量。
–int available()
返回值爲流中尚未讀取的字節的數量。
–long skip(long n)
讀指針跳過n個字節不讀,返回值爲實際跳過的字節數量
–close()
流操作完畢後必須關閉
–mark(int readlimit)
紀錄當前指針的所在位置.readlimit表示讀指針讀出的readlimit個字節後所標記的指針位置才實效。
–reset()
把讀指針重新指向用mark方法所記錄的位置
–boolean markSupported()
當前的流是否支持讀指針的記錄功能。
OutputStream中常見的方法:
–write(int b)
往流中寫一個字節b
–write(byte b[])
往流中寫一個字節數組b
–write(byte b[],int off,int len)
把字節數組b中從下標off開始,長度爲len的字節寫入流中
–flush()
刷空輸出流,並輸出所有被緩存的字節,由於某些流支持緩存功能,該方法將把緩存中所有內容強制輸出到流中。
–close()
流操作完畢後必須關閉。
Reader中常見的方法:
–int read()
讀取一個字符,並返回讀到的這個字符,讀到流的末尾則返回-1。
–int read(char[])
將讀到的字符存入指定的數組中,返回的是讀到的字符個數,
讀到流的末尾則返回-1。
–close()
讀取字符其實用的是window系統的功能,就希望使用完畢後,
進行資源的釋放。
FileReader除了自己的構造函數外沒有特有的方法:
–用於讀取文本文件的流對象。
–用於關聯文本文件。
–構造函數FileReader(String fileName)
在讀取流對象初始化時,必須要指定一個被讀取的文件,
如果該文件不存在則會發生FileNotFoundException異常。
Writer中常見的方法:
–write()
將一個字符寫入到流中。
–write(char[])
將一個字符數組寫入到流中。
–writer(String)
將一個字符寫入到流中。
–flush()
刷新流,將流中的數據刷新到目的地中,流還存在。
–close()
關閉資源,在關閉錢會先調用flush(), 刷新流中的數據到目的地。
輸入流和輸出流:
1)輸入流:文件----》程序
2)輸出流:程序----》文件
處理流和節點流(重點介紹):
1)節點流:直接對數據源進行讀寫操作
2)處理流:在節點流的基礎上,通過裝飾(裝飾模式)增強功能對數據源間接讀寫操作
1)緩衝流(Buffered):節點流之上進行加工,添加緩衝區(FileInputStream=>BufferedInputStream)這樣避免讀取文件時候,大量進行對硬盤的讀寫,而是從緩衝區進行讀寫,提高讀寫效率。
2)轉換流(StreamReader):即字節流與字符流的相互轉換。比如:在進行讀寫字節流設備時候,我想調用讀取字符流的函數,就可以通過轉換流。將(字節流=>字符流) InputStreamReader in=new InputStreamReader(new InputStream())注意只能是字節流轉換爲字符流!!
3) 數據流(Data):當讀取寫入具體的數值數據時候(Long Double)就可以採用DataInputStream和DataOutputStream流進行功能更加強大的寫入和讀取功能。