流的概念
流是一個(gè)抽象末誓、動(dòng)態(tài)的概念展运,是一連串連續(xù)動(dòng)態(tài)的數(shù)據(jù)集合。
Java中流的概念細(xì)分
按流的方向分類(lèi):
? ? ? 1. 輸入流:數(shù)據(jù)流向是數(shù)據(jù)源到程序(以InputStream透硝、Reader結(jié)尾的流)数焊。
? ? ??2. 輸出流:數(shù)據(jù)流向是程序到目的地(以O(shè)utPutStream、Writer結(jié)尾的流)膨处。
按處理的數(shù)據(jù)單元分類(lèi):
? ? ??1. 字節(jié)流:以字節(jié)為單位獲取數(shù)據(jù)见秤,命名上以Stream結(jié)尾的流一般是字節(jié)流砂竖,如FileInputStream、FileOutputStream鹃答。
? ? ??2. 字符流:以字符為單位獲取數(shù)據(jù)乎澄,命名上以Reader/Writer結(jié)尾的流一般是字符流,如FileReader挣跋、FileWriter三圆。
按處理對(duì)象不同分類(lèi):
? ? ??1. 節(jié)點(diǎn)流:可以直接從數(shù)據(jù)源或目的地讀寫(xiě)數(shù)據(jù),如FileInputStream避咆、FileReader舟肉、DataInputStream等。
? ? ??2. ?處理流:不直接連接到數(shù)據(jù)源或目的地查库,是”處理流的流”路媚。通過(guò)對(duì)其他流的處理提高程序的性能,如BufferedInputStream樊销、BufferedReader等整慎。處理流也叫包裝流。
? ? ??節(jié)點(diǎn)流處于IO操作的第一線(xiàn)围苫,所有操作必須通過(guò)它們進(jìn)行;處理流可以對(duì)節(jié)點(diǎn)流進(jìn)行包裝裤园,提高性能或提高程序的靈活性。
流的四大抽象類(lèi)分別是:
InputStream字節(jié)輸入流
??OutputStream字節(jié)輸出流
Reader字符輸入流?
Writer字符輸出流
文件字節(jié)流
FileInputStream通過(guò)字節(jié)的方式讀取文件剂府,適合讀取所有類(lèi)型的文件(圖像拧揽、視頻、文本文件等)腺占。Java也提供了FileReader專(zhuān)門(mén)讀取文本文件淤袜。
? ? ??FileOutputStream 通過(guò)字節(jié)的方式寫(xiě)數(shù)據(jù)到文件中,適合所有類(lèi)型的文件衰伯。Java也提供了FileWriter專(zhuān)門(mén)寫(xiě)入文本文件铡羡。
FileInputStream的常用方法有:
close()關(guān)閉流。
read() 從流中讀取單個(gè)字節(jié)意鲸,并以 int(0 到 255 之間)形式返回該字節(jié)烦周。
available() 獲取待讀取的字節(jié)數(shù)
代碼練習(xí):
文件字符流
字節(jié)流不能很好的處理Unicode字符,經(jīng)常會(huì)出現(xiàn)“亂碼”現(xiàn)象临扮。所以论矾,我們處理文本文件,一般可以使用文件字符流杆勇,它以字符為單位進(jìn)行操作
FileOutputStream的常用方法有:
write() 一次寫(xiě)一個(gè)字節(jié)
write(byte[] b) 直接寫(xiě)入byte數(shù)組的字符
flush() 刷新緩存,將字節(jié)數(shù)據(jù)與目的文件同步
close() 關(guān)閉流
代碼練習(xí):
緩沖字節(jié)流
?Java緩沖流本身并不具有IO流的讀取與寫(xiě)入功能饱亿,只是在別的流(節(jié)點(diǎn)流或其他處理流)上加上緩沖功能提高效率蚜退,就像是把別的流包裝起來(lái)一樣闰靴,因此緩沖流是一種處理流(包裝流)。
? ? ??當(dāng)對(duì)文件或者其他數(shù)據(jù)源進(jìn)行頻繁的讀寫(xiě)操作時(shí)钻注,效率比較低蚂且,這時(shí)如果使用緩沖流就能夠更高效的讀寫(xiě)信息。因?yàn)榫彌_流是先將數(shù)據(jù)緩存起來(lái)幅恋,然后當(dāng)緩存區(qū)存滿(mǎn)后或者手動(dòng)刷新時(shí)再一次性的讀取到程序或?qū)懭肽康牡亍?/p>
? ? ??因此杏死,緩沖流還是很重要的,我們?cè)贗O操作時(shí)記得加上緩沖流來(lái)提升性能捆交。
簡(jiǎn)述使用緩沖字節(jié)流進(jìn)行文件復(fù)制時(shí)提高效率的原理是什么淑翼?
讀文件和寫(xiě)文件都使用了緩沖區(qū),減少了讀寫(xiě)次數(shù)品追,從而提高了效率
當(dāng)創(chuàng)建這兩個(gè)緩沖流的對(duì)象時(shí)時(shí)玄括,會(huì)創(chuàng)建了內(nèi)部緩沖數(shù)組,缺省使用32字節(jié)大小的緩沖區(qū).
當(dāng)讀取數(shù)據(jù)時(shí)肉瓦,數(shù)據(jù)按塊讀入緩沖區(qū),其后的讀操作則直接訪問(wèn)緩沖區(qū)
當(dāng)寫(xiě)入數(shù)據(jù)時(shí),首先寫(xiě)入緩沖區(qū)嘿歌,當(dāng)緩沖區(qū)滿(mǎn)時(shí)钾麸,其中的數(shù)據(jù)寫(xiě)入所連接的輸出流。使用方法flush()可以強(qiáng)制將緩沖區(qū)的內(nèi)容全部寫(xiě)入輸出流
關(guān)閉流的順序和打開(kāi)流的順序相反.只要關(guān)閉高層流即可鲫趁,關(guān)閉高層流其實(shí)關(guān)閉的底層節(jié)點(diǎn)流
Flush的使用:手動(dòng)將buffer中內(nèi)容寫(xiě)入文件
代碼練習(xí):
緩沖字符流:
BufferedReader/BufferedWriter增加了緩存機(jī)制斯嚎,大大提高了讀寫(xiě)文本文件的效率,同時(shí)饮寞,提供了更方便的按行讀取的方法:readLine(); 處理文本時(shí)孝扛,我們一般可以使用緩沖字符流。
代碼練習(xí):
數(shù)據(jù)流
數(shù)據(jù)流將“基本數(shù)據(jù)類(lèi)型與字符串類(lèi)型”作為數(shù)據(jù)源幽崩,從而允許程序以與機(jī)器無(wú)關(guān)的方式從底層輸入輸出流中操作Java基本數(shù)據(jù)類(lèi)型與字符串類(lèi)型苦始。
? ? ??DataInputStream和DataOutputStream提供了可以存取與機(jī)器無(wú)關(guān)的所有Java基礎(chǔ)類(lèi)型數(shù)據(jù)(如:int、double慌申、String等)的方法陌选。
? ? ??DataInputStream和DataOutputStream是處理流,可以對(duì)其他節(jié)點(diǎn)流或處理流進(jìn)行包裝蹄溉,增加一些更靈活咨油、更高效的功能。
代碼練習(xí)
打印流
PrintStream的特點(diǎn)
可以實(shí)現(xiàn)將基本數(shù)據(jù)類(lèi)型格式化成字符串輸出
PrintWriter與PrintStream的區(qū)別
Printwriter操作的是字符
printStream操作的是字節(jié)