java輸入輸出--I/O流的概念和劃分
理解資料流
資料流(Stream)是一組有順序的,有起點的,有終點的位元組集合,是對輸入和輸出的總稱和抽象。
一般地,資料流分為 輸入流(InputStream)和輸出流(OutputStream)。輸入流只能讀不能寫,而輸出流只能寫不能讀。通常程式使用輸入輸出流,就好像資料流入程式,或從程式流出。
Java 程式通過流來完成輸入輸出。 流通過 java 的輸入輸出系統與物理裝置連線,儘管與它們連線的物理裝置不盡相同,所有流的行為具有同樣的方式。這樣,相同的輸入輸出類和方法適用於所有型別的外部裝置。這意味著一個輸入流能夠抽象多種不同型別的輸入:從磁碟檔案,從鍵盤或從網路套接字。同樣,一個輸出流可以輸出到控制檯,磁碟檔案或相連的網路。流是處理輸入輸出的一個簡便的方法。
把輸入流的指向稱作為資料來源(Data Source),把輸出流的指向稱作資料接收器(Data Sink),程式從資料來源讀入資料,向接收器寫資料,如下示意圖:
java 流的劃分
Java2 定義了兩種型別的流: 位元組流 和 字元流。位元組流(Byte Stream)為處理位元組的輸入和輸出提供了方法。例如:使用位元組流讀取或書寫二進位制資料。字元流(Character Stream)為 字元的輸入和輸出提供了方便。它們採用了統一的編碼標準,因而可以國際化。 在某些場合,字元流比位元組流更有效。
需要說明的是,在最底層,所有的輸入輸出都是位元組形式的。基於字元的流只為處理字元提供方便有效的方法。
位元組流類
位元組流在頂層由兩個抽象類:InputStream 和 OutputStream。每個抽象類都有多個具體的子類,這些子類對不同的外設進行處理,例如磁碟檔案,網路連線,甚至是記憶體緩衝區。
位元組輸入流 如下圖所示,灰色背景的類在使用的時候,需要具體的物理裝置,如檔案、陣列、管道等。白色背景的類(抽象類除外)在使用時,需要其他流的支援。
位元組輸入流的說明如下:
流 | 描述 |
---|---|
InputStream | 表示輸入位元組流的抽象類 |
FileInputStream | 檔案位元組輸入流 |
ByteArrayInputStream | 位元組陣列輸入流,把位元組陣列作為資料來源 |
FilterInputStream | 過濾位元組輸入流,提供擴充套件功能的輸入流 |
PipedInputStream | 管道輸入流,可用於執行緒之間通訊 |
ObjectInputStream | 物件輸入流 |
SequenceInputStream | 順序輸入流,把多個流順序合併成一個流 |
AudioInputStream | 音訊輸入流 |
BufferedInputStream | 緩衝輸入流 |
CipherInputStream | 加密輸入流,在輸入過程中,對資料進行加密或解密 |
DataInputStream | 包含讀取 Java 標準資料型別方法的輸入流 |
DigestInputStream | 摘要資料流,在輸入過程中,生成流的陣列摘要 |
ProgressMonitorInputStream | 過程監視輸入流 |
PushbackInputStream | 能夠向輸入流退回一個位元組的輸入流 |
位元組輸出流的說明如下:
流 | 描述 |
---|---|
OutputStream | 表示輸出位元組流的抽象類 |
FileOutputStream | 檔案位元組輸出流 |
ByteArrayOutputStream | 位元組陣列輸出流,把位元組陣列作為資料接收器 |
FilterOutputStream | 過濾位元組輸出流,提供擴充套件功能的輸出流 |
PipedOutputStream | 管道輸出流,可用於執行緒之間通訊 |
ObjcetOutputStream | 物件輸出流 |
BufferedOutputStream | 緩衝輸出流 |
CipherOutputStream | 加密輸出流,在輸出過程中,對資料進行加密或解密 |
DataOutputStream | 包含寫 Java 標準資料型別方法的輸出流 |
DigestOutputStream | 摘要資料流,在輸出過程中,生成流的數字摘要 |
PrintStream | 列印流,包含 print() 和 println()的輸出流 |
抽象類 InputStream 和 OutputStream 定義了實現其他流類的關鍵方法。最重要的兩種方法時 read() 和 write() ,它們分別用於讀寫位元組。 兩種方法都在 InputStream 和 OutputStream 中被定義為抽象方法。它們被派生的流類重寫。
位元組流中還有一個流:RandomAccessFile ,支援隨機地存取檔案中的內容。
字元流類
字元流類頂層由兩個抽象類:Reader 和Writer。這些抽象類處理統一編碼的字元流。java 中有多個具體的子類。
字元輸入流的描述
流 | 描述 |
---|---|
Read | 表示字元輸入流的抽象類 |
BufferedReader | 帶緩衝功能的字元輸入流 |
CharArrayReader | 把字元陣列作為輸入源的輸入流 |
FilterReader | 過濾字元輸入流 |
InputStreamReader | 位元組流向字元流轉化流 |
PipedReader | 管道字元輸入流 |
StringReader | 把字串作為資料來源的輸入流 |
LineNumberReader | 能夠統計行數的輸入流 |
PushbackReader | 能夠向輸入流退回一個字元的輸入流 |
FileReader | 檔案字元輸入流 |
字元輸出流的描述
流 | 描述 |
---|---|
Writer | 描述字元輸出流的抽象類 |
BufferedWriter | 帶緩衝功能的字元輸出流 |
OutPutStreamWriter | 位元組輸出流向字元輸出流的轉換 |
CharArrayWriter | 把字元陣列作為資料接收器 |
FilterWriter | 過濾字元輸出流 |
PipedWriter | 管道字元輸出流 |
PrintWriter | 列印字元輸出流,類似於PrintStream |
StringWriter | 把字串作為資料接收器 |
FileWriter | 檔案字元輸出流 |
抽象類 Reader 和 Writer 定義了幾個實現其他流類的關鍵方法。其中兩個最重要的是 read() 和 write() ,它們分別進行字元資料的讀 和 寫。這些方法被派生流類重寫。