Java.IO 包中定義了多個(gè)流類(lèi)型 (類(lèi)和抽象類(lèi)) 來(lái)實(shí)現(xiàn)輸入\輸出功能,
按數(shù)據(jù)流的方向不同可以分為輸入和輸出流
按處理數(shù)據(jù)單位不同可以分為字節(jié)流和字符流
按照功能的不同可以分為節(jié)點(diǎn)流和處理流
字節(jié)流 :完完全全按照二進(jìn)制編碼格式一個(gè)字節(jié)一個(gè)字節(jié)來(lái)讀的。
輸入流 InputStream 輸出流 OutputStream
字符流是按照一個(gè)字符一個(gè)字符來(lái)讀的,一個(gè)字符等于兩個(gè)字節(jié)。 會(huì)將讀取的字節(jié)數(shù)據(jù)根據(jù)當(dāng)前使用的字符進(jìn)行編譯
字符流 = 字節(jié)流+解碼。
輸入流 Reader 輸出流 Writer
只考慮文件操作情況下:
讀取操作是:input \ read 從硬盤(pán)(存儲(chǔ)設(shè)備) 到 內(nèi)存
寫(xiě)入操作是:output \ write 從內(nèi)存 到 硬盤(pán)(存儲(chǔ)設(shè)備)
節(jié)點(diǎn)流
節(jié)點(diǎn)流就相當(dāng)于一根管道直接插到數(shù)據(jù)源上面,直接讀數(shù)據(jù)源里面的數(shù)據(jù),或者直接往數(shù)據(jù)源里面寫(xiě)入數(shù)據(jù)。
典型的節(jié)點(diǎn)流是文件流:文件的字節(jié)輸入流(FileInputStream) 文件的字節(jié)輸出流(FileOutputstream)
文件的字符輸入流(FileReader),文件的字符輸出流(FileWriter)
處理流
處理流是”連接“在已存在的流(節(jié)點(diǎn)流或者處理流)之上,通過(guò)對(duì)數(shù)據(jù)的處理為程序提供更為強(qiáng)大的讀寫(xiě)功能。
InputStream 輸入流
繼承自InputStream的都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(8 bit);
具體方法
//讀取一個(gè)字節(jié)并以整數(shù)的形式返回
//如果返回-1 已到輸入流的末尾
int read() throws IOException
//讀取一系列字節(jié)并存儲(chǔ)到一個(gè)數(shù)組buffer
//返回存儲(chǔ)了讀取的字節(jié)的byte數(shù)組, 如果返回-1 已到輸入流的末尾
int read (byte[] buffer) throws IOException
close 關(guān)閉流,釋放資源
read方法是一個(gè)字節(jié)一個(gè)字節(jié)的讀。
read(byte[] buffer)方法是讀取是先把數(shù)據(jù)讀取到byte數(shù)組buffer里面,然后處理里面的數(shù)據(jù)。
OutputStream 輸出流
繼承自O(shè)utputStream的都是用于向程序中輸出數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(8 bit);
具體方法
//向輸出流中寫(xiě)入一個(gè)字節(jié),該字節(jié)數(shù)據(jù)為參數(shù)b的低八位
write(int b) throws IOException
//將一個(gè)字節(jié)類(lèi)型的數(shù)組中的數(shù)據(jù)寫(xiě)入流
write(byte[]b) throws IOException
//將一個(gè)字節(jié)型的數(shù)組中的從指定位置開(kāi)始的len個(gè)字節(jié)寫(xiě)入到輸出流
write(byte[]b,int off,int len) throws IOException
//關(guān)閉釋放內(nèi)存資源
close(); throws IOException
//將輸出流中緩沖的數(shù)據(jù)全部寫(xiě)出到目標(biāo)文件
flush() throws IOException
Reader 流
和InputStream 一模一樣,唯一的區(qū)別在于讀取的數(shù)據(jù)單位不同。繼承自Reader的流都是向程序中
輸入數(shù)據(jù),數(shù)據(jù)單位都是16bit
一個(gè)字符就是兩個(gè)字節(jié) 這種一個(gè)字符一個(gè)字符讀取的方式有它存在的必要性 比如中文在Unicode碼中中文占兩個(gè)
字節(jié) ,如果使用字節(jié)流來(lái)讀一次只能讀半個(gè)字。使用字符流就可以避免這個(gè)問(wèn)題。
//讀取一個(gè)字符并以整數(shù)形式返回 如果返回-1 已到輸入流的末尾
read() 返回int類(lèi)型 拋IO異常
//讀取一些字符并且儲(chǔ)存到一個(gè)buffer數(shù)組中
//返回實(shí)際讀取的字符數(shù) 如果返回-1 已到輸入流的末尾
read(char[] rea) 返回int類(lèi)型 拋IO異常
//關(guān)閉流釋放資源
close() 無(wú)返回值 拋IO異常
//跳過(guò)n個(gè)字符不讀 返回實(shí)際跳過(guò)的字節(jié)數(shù)
skip(long n) 返回long類(lèi)型 拋IO異常
Writer 流
//向輸出流中寫(xiě)入一個(gè)數(shù)據(jù)
write(int c); 無(wú)返回值 拋IO異常
//將一個(gè)字符型的數(shù)組寫(xiě)入輸出流
write(char[] c); 無(wú)返回值 拋IO異常
//將一個(gè)字符數(shù)組從指定位置開(kāi)始(offset)的指定長(zhǎng)度(length)個(gè)字符寫(xiě)入輸出流
write(char[] ,intoffset, int length); 無(wú)返回值 拋IO異常
//將一個(gè)字符串中的字符寫(xiě)入到輸出流
write(String string); 無(wú)返回值 拋IO異常
//將一個(gè)字符串從offset開(kāi)始的length個(gè)字符寫(xiě)入到輸出流
write(String string,int offset, int length) 無(wú)返回值 拋IO異常
//關(guān)閉流釋放資源
close();
處理流
1、緩沖流,緩沖流要“套接”在相應(yīng)的節(jié)點(diǎn)流之上,對(duì)讀寫(xiě)的數(shù)據(jù)提供了緩沖的功能,提高了讀寫(xiě)的效率,同時(shí)增加一些方法。
緩沖流是指帶有緩沖區(qū)的,緩沖區(qū)(Buffer)就是內(nèi)存里面的一小塊區(qū)域,讀寫(xiě)時(shí)都把數(shù)據(jù)放到這塊緩沖區(qū)域里面,減少io對(duì)于硬盤(pán)的訪問(wèn)次數(shù)。
先把數(shù)據(jù)放置到緩沖區(qū)上,等到緩沖區(qū)滿了以后,再 一次把緩沖區(qū)里面的數(shù)據(jù)寫(xiě)入硬盤(pán)或者讀取出來(lái)。
剩余內(nèi)容整理中。。。