一. 概述
什么是IO流?顧名思義,I表示input,O表示output,也就是輸入輸出流,主要是在程序與文件之間,用于傳輸數據的通道。既然要傳輸數據,那么我們需要理解文件和程序之間哪種方向的傳輸是輸入流,哪種傳輸作為輸出流?接下來平哥給大家舉一個生活中IO流的案例,如下圖所示:
流的流入流出,是以家庭用水為標準,從水庫到家庭用水是流入,從家庭用水到下水道是流出。同樣的,程序中的IO流,則是以程序代碼為標準,程序寫出數據到文件是輸出流,程序讀取文件數據是輸入流。
二. IO流的劃分
Java中的IO流有多種分類,一般有如下幾種。
按方向劃分:輸入流和輸出流
輸入流:從文件中讀取數據到程序;輸出流:從程序中寫出數據到文件。
按單位劃分:字節流和字符流
字節流:按一個字節一個字節讀寫,讀寫速度慢,可以讀寫所有文件,包括文本文件和二進制文件(圖片、音頻、視頻);字符流:按一個字符一個字符(一個字符=二個字節)讀寫,讀寫速度快,只能讀寫文本文件。
按功能劃分:節點流和處理流
節點流:沒有經過包裝的基礎流;處理流:經過包裝后,生成更為強大的流。
三. 流的分類
IO流有很多種,很多小白初學時都記不住這些流。其實我們只要按照規則來記,還是很容易記住的。我們可以按照后綴來記就可以了,例如,我們所學習的IO流,主要有字節流和字符流,字節流主要以綴Stream結尾,字節流主要以Reader和Writer結尾,如下所示:
字節流
字節流的抽象父類:Inputstream/OutputStream字節節點流:FileInputStream/FileOutputStream字節緩沖流:BufferedInputStream/BufferedOutputStream對象流:ObjectInputStream/ObjectOutputStream
字符流
字符流的抽象父類:Reader/Writer字符節點流:FileReader/FileWriter字符緩沖流:BufferedReader/BufferedWriter字符轉換流:InputStreamReader/OutputStreamWriter
四. 流的應用場景
在項目中,經常會有IO流的應用場景,我們經常用到的聊天通訊軟件,上傳和下載各種圖片、音樂、視頻等都離不開IO流。當然,不同的場景需要應用不同的IO流,平哥給大家整理了不同流的應用場景。
字節流
字節節點流:主要用于讀寫輕量級數據,例如做一些簡單的圖片拷貝操作。字節緩沖流:帶緩沖區的字節流,是對字節節點流的性能優化,當需要讀寫大批量的數據時可選擇字節緩沖流,例如拷貝視頻文件。對象流:用于讀寫實體對象數據到文件,且以序列化(文件中看不到數據內容)方式進行讀寫提升數據的安全性。
字符流
字符節點流:用于讀寫輕量級的文本文件,讀寫數據的功能實現都是靠繼承而來,俗稱富二代流。字符緩沖流:帶緩沖的字符流,與字節緩沖流類似,其性能比字節緩沖流更高,但只能讀寫文本文件。字符轉換流:可以將字節流轉換為字符流,可以用在對于字節流的優化上,例如socket編程中,將字節流的數據傳輸轉字符流來提升性能。