[重學Java基礎][Java IO流][Part.0]總述
IO流是Java很重要的一部分 但是並不好掌握 在初學Java中囫圇吞棗的學過之後 一直不是非常明白 這次就仔細研讀一下Java的IO流部分 確保自己能清楚的認識這一部分
邊學習邊看網絡上的資料 然後自己總結一下
IO流概述
IO流是什麼
IO流一般指java.io包下一系列方法和接口的總稱 ,可以從其中讀入一個字節序列的對象稱作輸入流,而可以向其中寫入一個字節序列的對象稱作輸出流。這些字節序列的來源地和目的地可以是文件,而且通常都是文件,但是也可以是網絡連接,甚至是內存塊。編程語言的I/O類庫中使用流這個抽象概念,它代表任何有能力產出數據的數據源對象或者是有能力接收數據的接收端對象。IO流能幹什麼
IO流提供了各種方式的數據輸入或者輸出功能java.io stream類結構總圖
部分方法在Java8 Java9中已刪除
IO流分類解析
按數據解析方式區分
字符流和字節流
字節流
直接讀入寫出二進制內容的數據操作流 可以操作所有的數據類型 以字節爲單位入寫出數據內容 通常以**Steam爲後綴命名
InputStream、OutputStream類是字節輸入流的抽象類,是所有字節輸入流的父類
字符流
字符流是可以直接讀取字符內容的數據流,相比於字節流讀入的二進制數據需要轉換才能顯示,字符流每次次讀入寫出一個字符單位數據,直接顯示內容,但其只能讀取字符類型數據。
通常以**Reader、**Writer爲後綴命名
Reader、writer類是字符輸入流的抽象類,是所有字符輸入流的父類
按流的走向區分
輸入流和輸出流
輸入流
從文件 數據源 管道等外界把數據輸入內存(用戶內存空間)輸入的流 包括各種字節輸入流*InputStream 各種字符輸入流*Reader輸出流
- 從內存(用戶內存空間)輸出數據到文件 數據源 管道等其他位置 包括各種字節輸出流*OutputStream 各種字符輸入流*Wrirer
按流的連接方式
節點流和處理流
- 節點流
用於直接操作目標數據源所對應的流叫節點流。 - 處理流
通過一個間接(包裝)流類去調用節點流類,以達到更加靈活方便地讀寫各種類型的數據,這個間接(包裝)流類就是處理流。
總結以上的分類 更詳細的流類圖
逐個分析
字符輸入流Reader
Reader爲所有字符輸入流的超類
節點流
包含三種基本節點流
FileReader PipedReader CharArrayReader
分別直接從三種數據節點讀取字符
- FileReader 從文件讀入
- PipedReader 從連接的管道讀入
- CharArrayReader 從字符數組讀入
處理流
- BufferedReader 緩衝字符讀取流
套在三種基本輸入流上面 可以一次讀取填滿緩衝區的數據 避免直接使用節點流導致的頻繁IO操作 增強了普通節點流的功能 此處應用裝飾器模式
其子類LinenumberReader 行級緩衝字符讀取流
繼承自BufferedReader 緩衝字符讀取流 在其基礎上添加了 獲取行號和設置行號的功能 同樣應用裝飾器模式
- InputStreamReader 字節讀取流-字符轉換器
是一個連接字節流 InputStream和字符輸出流Writer的橋樑,它將字節流轉變爲字符流 讓不可識別的二進制數據轉換爲人可認知的字符數據 此處應用了適配器模式
內存流
除了以上的輸入流 還有一種僞裝的輸入流 StringReader 繼承了Reader類 擁有了輸入流的特性 但是並不真正從數據源讀入數據 而是直接讀入字符串,適用於一些設計爲輸入流的接口使其可以直接從內存讀取數據
過濾流
所有FilterReader的子類都是過濾流
字符輸出流Writer
Writer爲所有字符輸出流的超類
節點流
同樣包含三種基本節點流
FileWriter PipedWriter CharArrayWriter
分別向三種數據節點輸出字符
- FileWriter 寫入到文件
- PipedWriter 寫入到連接的管道
- CharArrayWriter 寫入到字符數組
處理流
- BufferedWriter 緩衝字符輸出流
套在三種基本輸出流上面 可以一次讀取填滿緩衝區的數據 避免直接使用節點流導致的頻繁IO操作 增強了普通節點流的功能 此處應用裝飾器模式
- OutputStreamWriter 字節輸出流-字符轉換器
是一個連接字節流OutputStream和字符輸出流Writer的橋樑,它將字節流轉變爲字符流 讓不可識別的二進制數據轉換爲人可認知的字符數據 此處應用了適配器模式
內存流
除了以上的輸出流 還有一種僞裝的輸出流 StringWriter 繼承了Writer類 擁有了輸出流的特性 但是並不真正寫入數據匯而是以字符串形式保存在內存中,適用於一些設計爲輸出流的接口使其可以直接將數據保存在內存中
- 字符輸入流和字符輸出流對照圖
字節輸入流InputStream
基本節點流
類似字符輸入流 也有三種基本節點流
分別向三種數據節點輸入字節數據
- FileInputStream 寫入文件
- PipedInputStream 寫入管道
- ByteArrayInputStream 寫入字節數組
常用處理流
過濾裝飾流
FilterInputStream是所有字節輸入處理流的父類 它繼承了InputStream 並擴展了InputStream的功能 實例化時傳入一個InputStream對象 實質爲InputStream的裝飾器 應用了裝飾器模式 子類處理流繼承FilterInputStream 並添加了輸入流的過濾操作方法 常用的有三種
- DataInputStream
Java數據輸入流 DataInputStream允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型
- BufferInputStream
緩衝字節輸入流 擁有緩衝區的輸入流 可以一次直接讀入緩衝區長度的數據
- LineNumberInputStream
帶行號的緩衝字節輸入流 在BufferInputStream基礎上增加了讀入行號的方法
- PushBackInputStream
添加了進退功能的過濾流,即“推回 (push back)”或“取消讀取 (unread)”一個字節的能力。
其他處理流
- ObjectInputStream
反序列化對象輸入流 可以將序列化的對象讀入並解析
- SequenceInputStream
- 合併處理流 它從輸入流的有序集合開始,並從第一個輸入流開始讀取,直到到達文件末尾,接着從第二個輸入流讀取,依次類推,直到到達包含的最後一個輸入流的文件末尾爲止
字節輸出流OutputStream
節點流
類似字符輸出流 也有三種基本節點流
分別向三種數據節點輸入字節數據
- FileOutputStream 寫入文件
- PipedOutputStream 寫入管道
- ByteArrayOutputStream 寫入字節數組
常用處理流
- DataOutputStream
Java數據輸出流 DataOutputStream允許應用程序以與機器無關方式向輸入流中寫入基本類型數據 - ObjectOutputStream
序列化對象輸出流 可以將內存中的普通對象序列化 - PrintStream
打印輸出流
- 字節輸入流和字符輸出流對照圖
非流部分
在java.io包下 不僅僅只有IO流 還有其他數據操作的對象
- File 文件對象
在整個io包中,唯一表示與文件本身有關的類就是File類。使用File類可以進行創建或刪除文件以及文件夾等常用操作
- FileDescriptor 文件描述符
- RandomAccessFile 文件隨機訪問類
異常
標準輸入/輸出
程序的所有輸入都來自於標準輸入,它的所有輸出也都可以發送到標準輸出,以及所有的錯誤信息都可以發送到標準錯誤。標準I/O的意義在於,我們可以很容易地把程序串聯起來,一個程序的標準輸出可以成爲另一程序的標準輸入。
按照標準I/O模型,Java提供了System.in、System.out和System.err。其中System.out已經事先被包裝成了printStream對象。System.err同樣也是PrintStream,但System.in卻是一個沒有被包裝過的未經加工的InputStream。這意味着儘管我們可以立即使用System.out和System.err,但是在讀取System.in之前必須對其進行包裝。
壓縮流
在日常的使用中經常會使用到像WinRAR或WinZIP這樣的壓縮文件,通過這些軟件可以把一個很大的文件進行壓縮以方便傳輸。
在JAVA中 爲了減少傳輸時的數據量也提供了專門的壓縮流,可以將文件或文件夾壓縮成ZIP、JAR、GZIP等文件的格式。