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