流的分類:
從不同的角度對(duì)流進(jìn)行分類:
1、處理的數(shù)據(jù)單位不同,分為:字符流 字節(jié)流
2、數(shù)據(jù)流方向不同,可分為:輸入流,輸出流
3、功能不同,分為:節(jié)點(diǎn)流,處理流
處理的數(shù)據(jù)單位:
字節(jié)流byte streams:
字節(jié)流是執(zhí)行基于8位字節(jié)的輸入和輸出,一次讀寫一節(jié)的數(shù)據(jù)。字節(jié)流是I/O的最底層流技術(shù)。如果你正閱讀或者寫入字符數(shù)據(jù)的最佳方法是使用字符流,其他流建立在字節(jié)之上
字符流 character streams:
字符流是執(zhí)行基于16位字節(jié)(即兩字節(jié))的輸入和輸出,它一次讀寫一個(gè)字符(兩個(gè)字節(jié))的數(shù)據(jù)。所有的字符流類都是從Reader、Writer兩個(gè)類延伸下來(lái)的,我們可以使用FileReader、FileWriter類進(jìn)行讀寫I/O文件
功能分類:
節(jié)點(diǎn)流:
從一個(gè)特定的數(shù)據(jù)源讀寫數(shù)據(jù),節(jié)點(diǎn)流是直接操作文件,網(wǎng)絡(luò)的流。如FileInputStream和FileOutputStream,他們直接從文件中讀取或往文件中寫入字節(jié)流。
處理流:
“連接”在已存在的流(節(jié)點(diǎn)流或處理流)之上通過(guò)對(duì)數(shù)據(jù)的處理為程序提供更為強(qiáng)大的讀寫功能。過(guò)濾流是使用一個(gè)已經(jīng)存在的輸入流或輸出流連接創(chuàng)建的,過(guò)
濾流就是對(duì)節(jié)點(diǎn)流進(jìn)行一系列的包裝。例如BufferedInputStream和BufferedOutputStream,使用已經(jīng)存在的節(jié)點(diǎn)流來(lái)構(gòu)
造,提供帶緩沖的讀寫,提高了讀寫的效率,以及DataInputStream和DataOutputStream,使用已經(jīng)存在的節(jié)點(diǎn)流來(lái)構(gòu)造,提供了
讀寫Java中的基本數(shù)據(jù)類型的功能。他們都屬于過(guò)濾流。
Buffered緩沖流:
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是帶緩沖區(qū)的處理流。
緩沖流的作用:
避免每次跟磁盤打交道,提高數(shù)據(jù)的訪問(wèn)效率。(提高流的操作率),所以在緩沖區(qū)之前必須要有流對(duì)象。
利用緩沖區(qū)技術(shù)字符流讀取操作。(BufferedReader) 步驟:
1,定義流對(duì)象與被讀取文件相關(guān)聯(lián)FileReader fr=new
FileReader("f:\\1.txt");
2,定義緩沖區(qū),把流對(duì)象作為參數(shù)放進(jìn)緩沖區(qū):
BufferedReader br=new BufferedReader(fr);
3,利用while循環(huán),一行一行的讀?。?/span>br.readLine();此處返回類型是一個(gè)String,如果返回為null說(shuō)明已讀取到末尾處)
String len=null;
while((len=br.readLine())!=null){
System.out.println("讀出了:"+len);
}
4,最后關(guān)閉資源。
readLine原理:
無(wú)論是讀一行,獲取多個(gè)字符,最終都是從硬盤上一個(gè)一個(gè)的讀取,都是使用read方法中一次讀取一個(gè)字符的方法。readLine中封裝了數(shù)組,每讀一個(gè)就放在緩沖區(qū)中(不立即返回),當(dāng)讀到\r\n時(shí),表示讀取一行結(jié)束,因此此時(shí)就返回一行數(shù)據(jù)。
總結(jié):
流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件,內(nèi)存,或是網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向目的地的流。
|