流在Java中是指計算中流動的緩沖區。
從外部設備流向中央處理器的數據流成為“輸入流”,反之成為“輸出流”。
字符流和字節流的主要區別:
1.字節流讀取的時候,讀到一個字節就返回一個字節;字符流使用了字節流讀到一個或多個字節(中文對應的字節數是兩個,在UTF-8碼表中是3個字節)時。先去查指定的編碼表,將查到的字符返回。
2.字節流可以處理所有類型數據,如:圖片,MP3,AVI視頻文件,而字符流只能處理字符數據。只要是處理純文本數據,就要優先考慮使用字符流,除此之外都用字節流。
1.字節流:
字節輸入流類:FileInputStream、BufferedInputStream和DataInputStream
FileInputStream:此類用於從本地文件系統中讀取文件內容。
構造方法:
·FileInputStream(File file):打開一個到實際文件的連接來創建一個FileInputStream,該文件通過文件系統中的File對象file指定。
·FileInputStream(String name):打開一個到實際文件的連接來創建一個FileInputStream,該文件通過文件系統中的路徑名name指定。
常用方法:
·int available():返回下一次對此輸入流調用的方法不受阻塞地從此輸入流讀取(或跳過)的估計剩余字節數。
·void close():關閉此文件輸入流並釋放與該流關聯的所有系統資源。
BufferedInputStream:此類本身帶有一個緩沖區,在讀取數據時,先放到緩沖區中,可以減少對數據源的訪問,提高運行的效率。
構造方法:
·BufferedInputStream(InputStream in):創建一個BufferedInputStream並保存其參數,即輸入流in,以便將來使用。
·BufferedInputStream(InputStream in,int size):創建一個具有指定緩沖區大小的BufferedInputStream並保存其參數,即輸入流in,以便將來使用。
常用方法:
·int available():返回下一次對此輸入流調用的方法不受阻塞地從此輸入流讀取(或跳過)的估計剩余字節數。
·void close():關閉此輸入流並釋放與該流關聯的所有系統資源。
·int read():從輸入流中讀取數據的下一個字節。
·int read(byte[] b,int off,int len):從此字節輸入流中給定偏移量處開始將各字節讀取到指定的byte數組中。
DataInputStream:該類提供一些基於多字節讀取方法,從而可以讀取基本數據類型的數據。
構造方法:
·DataInputStream(InputStream in):使用指定的底層InputStream創建一個DataInputStream。
常用方法:
·int read(byte[] b):從包含的輸入流中讀取一定數量的字節,並將它們存儲到緩沖區數組b中。
·int read(byte[] b,int off,int len):從包含的輸入流中將最多len個字節讀入一個byte數組中。
字節輸出流類:FileOutputStream、BufferedOutputStream和DataOutputStream
FileOutputStream:此類用於從本地文件系統的文件中寫入數據。
構造方法:
·FileOutputStream(File file):創建一個向指定File對象表示的文件中寫入數據的文件輸出流。
·FileOutputStream(String name):創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
常用方法:
·void close():關閉此文件輸出流並釋放與此流有關的所有系統資源。
·FileDescriptor getFD():返回與此流有關的文件描述符。
·void write(byte[] b):將b.length個字節從指定byte數組寫入此文件輸出流中。
·void write(byte[] b,int off,int len):將指定byte數組中從偏移量off開始的len個字節寫入此文件輸出流。
·void write(int b):將指定字節寫入此文件輸出流。
BufferedOutputStream:此類本身帶有一個緩沖區,在寫入數據時,先放到緩沖區中,實現緩沖的數據流。
構造方法:
·BufferedOutputStream(OutputStream out):創建一個新的緩沖輸出流,來將數據寫入指定的底層輸入流。
·BufferedOutputStream(OutputStream out,int size):創建一個新的緩沖輸出流,來將具有指定緩沖區大小的數據寫入指定的底層輸出流。
常用方法:
·void flush():刷新此緩沖的輸出流。
·void write(byte[] b,int off,int len):將指定byte數組中從偏移量off開始的len個字節寫入此緩沖的輸出流。
·void write(int b):將指定的字節寫入此緩沖的輸出流。
DataOutputStream(OutputStream out):創建一個新的數據輸出流,將數據寫入指定基礎輸出流。
常用方法:
·void flush():清空此數據輸出流。
·int size():返回計數器written的當前值,即到目前為止寫入此數據輸出流的字節數。
·void write(byte[] b,int off,int len):將指定byte數組中從偏移量off開始的len個字節寫入基礎輸出流。
·void write(int b):將指定字節(參數b的八個低位)寫入基礎輸出流。
2.字符流:
FileReader:用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是適當的。
構造方法:
·FileReader(File file):在給定從中讀取數據的File的情況下創建一個新的FileReader。
·FileReader(String fileName):在給定從中讀取數據的文件名的情況下創建一個新的FileReader。
BufferedReader類是Reader類的子類,為Reader對象添加字符緩沖器,為數據輸入分配內存存儲空間,存取數據更為有效。
構造方法:
·BufferedReader(Reader in):創建一個使用默認大小輸入緩沖區的緩沖字符輸入流。
·BufferedReader(Reader in,int sz):創建一個使用指定大小輸入緩沖區的緩沖字符輸入流。
操作方法:
·void close():關閉該流並釋放與之關聯的所有資源。
·void mark(int readAheadLimit):標記流中的當前為止。
·boolean markSupported();判斷此流是否支持mark()操作。
·int read():讀取單個字符。
·int read(char[] cbuf,int off,int len):將字符讀入數組的某一部分。
·String readLine():讀取一個文本行。
·boolean ready():判斷此流是否已准備好被讀取。
·void reset():將流重置到最新的標記。
·long skip(long n):跳過字符。
FileWriter:用來寫入字符文件的便捷類,可用於寫入字符流。
構造方法:
·FileWriter(File file):根據給定的File對象構造一個FileWriter對象。
·FileWriter(String filename):根據給定的文件名構造一個FileWriter對象。
BufferedWriter:將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
Java輸入/輸出流體系中常用的流分類(表內容來自java瘋狂講義)
注:下表中帶下划線的是抽象類,不能創建對象。粗體部分是節點流,其他就是常用的處理流。
流分類 | 使用分類 | 字節輸入流 | 字節輸出流 | 字符輸入流 | 字符輸出流 |
抽象基類 | InputStream | OutputStream |
Reader | Writer | |
節點流 | 訪問文件 | FileInputStream | FileOutStream | FileReader | FileWriter |
訪問數值 | ByteArrayInputStream | ByteArrayOutStream | CharArrayReader | CharArrayWriter | |
訪問管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter | |
訪問字符串 | StringReader | StringWriter | |||
處理流 | 緩沖流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
轉換流 | InputStreamReader | OutputStreamWriter | |||
對象流 | ObjectInputStream | ObjectOutputStream | |||
抽象基類(過濾) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回輸入流 | PushbackInputStream | PushbackReader | |||
特殊流 | DataInputStream | DataOutputStream |
——————————————————————————————————————————————————————————————————
總結:
1.Java IO是采用的是裝飾模式,即采用處理流來包裝節點流的方式,來達到代碼通用性。
2.處理流和節點流的區分方法,節點流在新建時需要一個數據源(文件、網絡)作為參數,而處理流需要一個節點流作為參數。
3.處理流的作用就是提高代碼通用性,編寫代碼的便捷性,提高性能。
4.節點流都是對應抽象基類的實現類,它們都實現了抽象基類的基礎讀寫方法。其中read()方法如果返回-1,代表已經讀到數據源末尾。
參考鏈接:https://www.cnblogs.com/lca1826/p/6427177.html
參考鏈接:https://www.cnblogs.com/moonpool/p/5488463.html