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