io系列之字节流
java中io流系統(tǒng)龐大,知識(shí)點(diǎn)眾多,作為小白通過(guò)五天的視頻書(shū)籍學(xué)習(xí)后,總結(jié)了io系列的隨筆,以便將來(lái)復(fù)習(xí)查看。
本篇為此系列隨筆的第一篇:io系列之字節(jié)流。
?
一、字節(jié)流的File讀寫(xiě)操作。
InputStream and OutputStream
一)、 OutputStream: 字節(jié)輸出流。
以一個(gè)操作文件的例子進(jìn)行說(shuō)明: FileOutputStream (說(shuō)明,該類(lèi)對(duì)象必須指向一個(gè)文件,)
構(gòu)造方法:
FileOutputStream(File file) 創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流.
FileOutputStream(File file, boolean append) 創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流。
FileOutputStream(FileDescriptor fdObj) 創(chuàng)建一個(gè)向指定文件描述符處寫(xiě)入數(shù)據(jù)的輸出文件流,
該文件描述符表示一個(gè)到文件系統(tǒng)中的某個(gè)實(shí)際文件的現(xiàn)有連接。
FileOutputStream(String name) 創(chuàng)建一個(gè)向具有指定名稱的文件中寫(xiě)入數(shù)據(jù)的輸出文件流。
使用方法及注意事項(xiàng):
如: FileOutputStream fo = new FileOutputStream("filme.txt");
1、會(huì)在程序執(zhí)行路徑下創(chuàng)建一個(gè)filme.txt文件,該路徑不因包名的變化而變化,只在執(zhí)行路徑下。
2、如果該路徑下已有同名文件,那么該文件會(huì)被覆蓋。
FileOutputStream(String name, boolean append) 根據(jù)給定的文件名以及指示是否附加寫(xiě)入數(shù)據(jù)的 boolean 值來(lái)構(gòu)造 FileWriter 對(duì)象。
使用方法及注意事項(xiàng):
如: FileOutputStream fo = new FileOutputStream("filme.txt",true);
1、如果傳入的參數(shù)為true,會(huì)在程序執(zhí)行路徑下打開(kāi)一個(gè)已有的filme.txt文件。
2、如果該路徑下沒(méi)有該文件,則新建一個(gè)該文件, 并在文件末尾添加數(shù)據(jù)。
3、如果傳入的參數(shù)為false,無(wú)論有無(wú)文件都會(huì)新建該文件。
示例:1、以傳入文件名的方式創(chuàng)建一個(gè)FileOutputStream對(duì)象(該對(duì)象一被初始化就必須明確被操作的文件)
2、而且該文件會(huì)被新創(chuàng)建到指定目錄下。
??3、路勁描述: 如: "D:\\java\\myclass\\winter.txt"
寫(xiě)入方法:void write(byte[] b) 將 b.length 個(gè)字節(jié)從指定 byte 數(shù)組寫(xiě)入此文件輸出流中。
void write(byte[] b, int off, int len) 將指定 byte 數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入此文件輸出流。
??void write(int c) 寫(xiě)入指定字節(jié)(就是寫(xiě)入該int型數(shù)的低八位,最后一個(gè)字節(jié))。
如: fo.write("winter is coming".getBatys());
注意:字節(jié)流與字符流不同,這里每寫(xiě)入一個(gè)字節(jié)都會(huì)直接存入文件中,不需要flush()。
off表示開(kāi)始角標(biāo), len為長(zhǎng)度。
刷新方法: 字節(jié)流不需要刷新,沒(méi)有flush方法。
關(guān)閉方法:void close() 關(guān)閉此流。
如: fo.close();
?(為了節(jié)約Windows資源,最后一定要 close ,關(guān)閉io。)
注意:1、 幾乎所有的IO操作都會(huì)拋出 IOException 異常,注意對(duì)異常的處理(try、catch或者throws)
2、在程序調(diào)用Io結(jié)束后,一定使用 close語(yǔ)句結(jié)束流對(duì)象。
二)、InputStream :字符輸入流。
以一個(gè)操作文件的例子進(jìn)行說(shuō)明: FileInputStream (說(shuō)明,該類(lèi)對(duì)象必須指向一個(gè)文件,)
構(gòu)造方法:
FileInputStream(String name) 在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新 FileInputStream
使用方法及注意事項(xiàng):
如: FileInputStream fi = new FileInputStream("filme.txt");
1、創(chuàng)建一個(gè)FileInputStream對(duì)象,該對(duì)象會(huì)指向 filme.txt 文件。
2、該文件必須存在,否則拋出 FileNotFoundException 異常。
FileInputStream(FileDescriptor fdObj) 通過(guò)使用文件描述符 fdObj 創(chuàng)建一個(gè) FileInputStream,
該文件描述符表示到文件系統(tǒng)中某個(gè)實(shí)際文件的現(xiàn)有連接。
FileInputStream(File file) 通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream,
該文件通過(guò)文件系統(tǒng)中的 File 對(duì)象 file 指定。
取出方法:
int read() 讀取單個(gè)字節(jié)數(shù)據(jù), 返回值為該字節(jié)值, 可使用(char)強(qiáng)轉(zhuǎn)為字符形式。
從文件的開(kāi)頭, 隨著該方法的不斷調(diào)用,一直讀到文件結(jié)尾, 之后返回 -1.
取出的字節(jié)本身只有8為,但是變?yōu)閕nt型被補(bǔ)0到了32為(平時(shí)提升是補(bǔ)1,但是此處有位與255操作).
如: int i = fi.read(), char c = (char)i;
int read(byte[] b, int off, int len) 將字節(jié)數(shù)據(jù)讀入字節(jié)數(shù)組的某一部分
將文件中的數(shù)據(jù)從文件頭開(kāi)始讀取,并存入數(shù)組,直到文件中數(shù)據(jù)讀完 或者 數(shù)組位置存滿。
只要文件中還有數(shù)據(jù)可讀,便返回讀取的字節(jié)個(gè)數(shù)。如果文件中已經(jīng)沒(méi)有數(shù)據(jù)可讀,返回-1.
如: int i = 0; baty [] b = new baty[1024];
?while((i = fi.read(c))!=-1)
?{ System.out.print(new String(b,0,i)); }
獲取文件字節(jié)數(shù):
int available() 返回下一次對(duì)此輸入流調(diào)用的方法可以不受阻塞地從此輸入流讀取(或跳過(guò))的估計(jì)剩余字節(jié)數(shù)。
即:返回剩余的字節(jié)數(shù)。
可以用來(lái)作為定義接受數(shù)據(jù)的字節(jié)數(shù)組長(zhǎng)度的依據(jù), 但是大型文件(如視頻等)不建議使用該方法。
結(jié)束方法:
void close() 關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。 此語(yǔ)句為必須執(zhí)行語(yǔ)句。
二、字節(jié)流的 緩沖功能
緩沖區(qū)的出現(xiàn)是為了增加流的效率的,所以建立緩沖區(qū)之前必須要先有流對(duì)象。
緩沖區(qū)對(duì)象只是給傳入的流對(duì)象加了一個(gè)緩沖區(qū),他的所有的讀、寫(xiě)功能其實(shí)還是在調(diào)用原來(lái)的流對(duì)象的功能(close關(guān)閉的是流對(duì)象)
一)、BufferedOutputStream :
構(gòu)造方法:
BufferedOutputStream(OutputStream out) 創(chuàng)建一個(gè)新的緩沖輸出流,以將數(shù)據(jù)寫(xiě)入指定的底層輸出流。
如:FileOutputStream fo = new FileOutputStream()
BufferedOutputStream bo = new BufferedOutputStream(fo);
為流對(duì)象 fo建立了一個(gè)緩沖區(qū)對(duì)象fo。
BufferedOutputStream(OutputStream out, int size) 創(chuàng)建一個(gè)新的緩沖輸出流,以將具有指定緩沖區(qū)大小的數(shù)據(jù)寫(xiě)入指定的底層輸出流。
如:FileOutputStream fo = new FileOutputStream()
BufferedOutputStream bo = new BufferedOutputStream(fo,1024);
為流對(duì)象 fo建立了一個(gè)緩沖區(qū)對(duì)象 bo,緩沖長(zhǎng)度為 1024個(gè)字符。
寫(xiě)入方法:
void write(byte[] b, int off, int len) 將指定 byte 數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入此緩沖的輸出流。
void write(int b) 將指定的字節(jié)寫(xiě)入此緩沖的輸出流。(其指定字節(jié)就是int型數(shù)據(jù)的最后八位)
與傳入的流對(duì)象相同, 這些方法底層就是在調(diào)用流對(duì)象的相應(yīng)方法。
關(guān)閉方法:void close();
與傳入的流對(duì)象相同, 此方法底層就是在調(diào)用流對(duì)象的close方法,緩沖區(qū)調(diào)用了過(guò)后,流對(duì)象不用重復(fù)關(guān)閉。
其他方法:
void flush() 刷新此緩沖的輸出流。
二)、BufferedInputStream:
構(gòu)造方法:
BufferedInputStream(InputStream in) 創(chuàng)建一個(gè) BufferedInputStream 并保存其參數(shù),即輸入流 in,以便將來(lái)使用。
如:FileInputStream fi = new FileInputStream()
BufferedInputStream bi = new BufferedInputStream(fi);
為流對(duì)象 fi建立了一個(gè)緩沖區(qū)對(duì)象 bi。
BufferedInputStream(FileInputStream in, int sz) 創(chuàng)建具有指定緩沖區(qū)大小的 BufferedInputStream 并保存其參數(shù),。
如:FileInputStream fi = new FileInputStream()
BufferedInputStream bi = new BufferedInputStream(fi,1024);
為流對(duì)象 fi建立了一個(gè)緩沖區(qū)對(duì)象 bi,緩沖長(zhǎng)度為1024個(gè)字符。
取出方法: 基本方法有流對(duì)象的相同(因?yàn)樵谡{(diào)用流對(duì)象方法), 但是多了一個(gè)行讀取方法。
int read() 讀取單個(gè)字節(jié),返回值為該字節(jié)前補(bǔ) 0 至4個(gè)字節(jié)長(zhǎng)度(write的 時(shí)候只寫(xiě)入最后一個(gè)字節(jié))
(本來(lái)數(shù)據(jù)提升是在前補(bǔ)1的,但是此處內(nèi)部有位與255操作)
從文件的開(kāi)頭, 隨著該方法的不斷調(diào)用,一直讀到文件結(jié)尾, 之后返回 -1.
int read(bate[] cbuf, int off, int len) 將字節(jié)讀入數(shù)組的某一部分
將文件中的數(shù)據(jù)從文件頭開(kāi)始讀取,并存入數(shù)組,知道文件中數(shù)據(jù)讀完 或者 數(shù)組位置存滿。
只要文件中還有數(shù)據(jù)可讀,便返回讀取的字節(jié)個(gè)數(shù)。如果文件中已經(jīng)沒(méi)有數(shù)據(jù)可讀,返回-1.
如: int i = 0; Bate [] b = new Bate[1024];
?while((i = bi.read(b))!=-1)
?{ System.out.print(new String(b,0,i)); }
結(jié)束方法:
void close() 關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。 此語(yǔ)句為必須執(zhí)行語(yǔ)句。
底層調(diào)用 流對(duì)象的 close 方法。
轉(zhuǎn)載于:https://www.cnblogs.com/soficircle/p/6714315.html
總結(jié)
- 上一篇: 【hihocoder 1312】搜索三·
- 下一篇: Adobe Acrobat DC