更新時(shí)間:2020-06-01 16:15:13 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2382次
所謂的IO即Input(輸入)/Output(輸出),當(dāng)軟件與外部資源(例如:網(wǎng)絡(luò),數(shù)據(jù)庫(kù),磁盤(pán)文件)交互的時(shí)候,就會(huì)用到IO操作。而在IO操作中,最常用的一種方式就是流,也被稱為IO流。IO操作比較復(fù)雜,涉及到的系統(tǒng)調(diào)用比較多,相對(duì)操作內(nèi)存而言性能很低。然而值得興奮的是,Java提供了很多實(shí)現(xiàn)類(lèi)以滿足不同的使用場(chǎng)景,這樣的實(shí)現(xiàn)類(lèi)有很多,我只挑選些在日常編碼中經(jīng)常用到的類(lèi)進(jìn)行說(shuō)明,本節(jié)主要介紹和文件操作相關(guān)的流,下面一起來(lái)瞧瞧吧。
FileOutputStream&FileInputStream字節(jié)流
File只是能操作文件或文件夾,但是并不能操作文件中的內(nèi)容,要想操作文件的內(nèi)容就需要使用文件IO流,其操作文件的內(nèi)容主要有兩種方式:以字節(jié)的方式和以字符的方式。而該小節(jié)主要講以字節(jié)文件流的形式操作文件內(nèi)容,以字符文件流的方式操作我留到下一小節(jié)進(jìn)行說(shuō)明。
在Java中以字節(jié)流的形式操作文件內(nèi)容的類(lèi)主要是FileOutputStream和FileInputStream。分別是OutputStream(字節(jié)輸出流)和InputStream(字節(jié)輸入流)抽象基類(lèi)的子類(lèi)。下面以圖片的復(fù)制來(lái)展示下該流的用法。
File?sourceFile?=?new?File("sourceFile.jpg");?
File?destFile?=?new?File("destFile.jpg");
FileInputStream?fis=null;?//?讀取源文件的流
FileOutputStream?fos?=?null;?//?輸出到目標(biāo)文件的流
try?{
?fis?=?new?FileInputStream(sourceFile);
?fos?=?new?FileOutputStream(destFile);
?byte[]?bytes=?new?byte[1024];
?int?len?=?0;
?while((len=fis.read(bytes))!=-1)?{
?fos.write(bytes,?0,?len);
?}
}
catch(IOException?ex)?{}
finally?{
?try?{?fis.close();}?catch(IOException?ex)?{}?
?try?{?fos.close();}?catch(IOException?ex)?{}?
}
在使用FileOutputStream和FileInputStream的過(guò)程中需要注意的地方:
FileInputStream所要操作的文件必須存在,否則就會(huì)拋出異常。而FileOutputStream寫(xiě)入的目的文件則不需要存在,當(dāng)不存在時(shí)會(huì)被創(chuàng)建,存在的時(shí)候會(huì)被覆蓋,也可以使用FileOutputStream造函數(shù)的第二個(gè)參數(shù),來(lái)實(shí)現(xiàn)追加文件內(nèi)容。
在使用FileInputStream讀取字節(jié)的時(shí)候,當(dāng)讀取到字節(jié)的末尾,再繼續(xù)讀取,無(wú)論多少次都會(huì)返回-1,而返回值len表示本次讀取了多少個(gè)字節(jié)。通常情況下每次讀取1024個(gè)字節(jié),可以達(dá)到空間和時(shí)間的平衡。但是具體情況也是需要具體分析的。
字節(jié)流是不存在緩沖區(qū)的,所以不需要使用flush操作刷新緩沖區(qū),字節(jié)的讀取和寫(xiě)入都是通過(guò)操作系統(tǒng)來(lái)實(shí)現(xiàn)的。
只要是流就是需要關(guān)閉的,無(wú)論是否在異常情況下都需要關(guān)閉流,防止占用系統(tǒng)資源,導(dǎo)致其他程序無(wú)法對(duì)該文件進(jìn)行操作。但是在關(guān)閉流的時(shí)候也有可能會(huì)報(bào)異常,所以也需要try...catch。
FileOutputStream和FileInputStream主要用來(lái)操作字節(jié)表現(xiàn)形式的文件,例如圖片,可執(zhí)行程序等。當(dāng)然操作字符表現(xiàn)形式的文件也是沒(méi)有問(wèn)題的,只不過(guò)這么干不規(guī)范。
OutputStreamWriter&InputStreamReader
這小節(jié)主要講以字符流的形式操作文件,在Java中對(duì)應(yīng)操作的主要類(lèi)為OutputStreamWriter和InputStreamReader。有時(shí)候又稱它們?yōu)檗D(zhuǎn)換流,具體原因一會(huì)在說(shuō),先看一個(gè)例子。
File?sourceFile?=?new?File("sourceFile.txt");
File?destFile?=?new?File("destFile.txt");
?
FileInputStream?fis=?new?FileInputStream(sourceFile);
FileOutputStream?fos?=?new?FileOutputStream(destFile);?
InputStreamReader?reader=null;
OutputStreamWriter?writer=null;
try?{
?reader=?new?InputStreamReader(fis,"utf-8");
?writer?=new?OutputStreamWriter(fos,"gbk");
?char[]?cbuf?=new?char[1024];
?int?len=0;
?while((len=reader.read(cbuf))!=-1)?{
?System.out.println(String.copyValueOf(cbuf,0,len));
?writer.write(cbuf,?0,?len);
?}
}
catch(IOException?ex)?{
?try{reader.close();}catch(IOException?ex)?{?}
?try{writer.close();}catch(IOException?ex)?{?}
}
上述示例主要實(shí)現(xiàn)了一個(gè)文件的復(fù)制,與字節(jié)流的使用方式不同的是,字符流的構(gòu)造函數(shù)需要傳遞字節(jié)流和編碼格式。這是因?yàn)椴僮魑募?nèi)容都是以字節(jié)的形式來(lái)操作的。字符輸入流根據(jù)編碼表對(duì)字節(jié)流讀取的字節(jié)轉(zhuǎn)義成字符,同時(shí)也說(shuō)明了傳遞編碼表格式參數(shù)的重要性。如果被讀取文件編碼格式是UTF-8且不傳遞這個(gè)參數(shù),那么這個(gè)參數(shù)為操作系統(tǒng)的默認(rèn)編碼表(對(duì)于Windows而言是GBK),如果默認(rèn)的編碼表與UTF-8不同(與系統(tǒng)編碼表格式相同,可不傳遞此參數(shù)),在轉(zhuǎn)義為字符的過(guò)程中就會(huì)出現(xiàn)問(wèn)題。假如文件內(nèi)容為“好”,在UTF-8中對(duì)應(yīng)的字節(jié)為-10-20-30。那么就以系統(tǒng)的默認(rèn)編碼表來(lái)轉(zhuǎn)義,假如默認(rèn)為GBK,“好”字的編碼為-50-60,由原來(lái)3個(gè)字節(jié)表示漢字,現(xiàn)在變成了2個(gè)字節(jié)表示漢字,又由于編碼表不兼容,所以導(dǎo)致出現(xiàn)亂碼。而在使用字符輸出流的時(shí)候,將字符按照編碼表參數(shù)轉(zhuǎn)化為字節(jié)后再寫(xiě)入對(duì)應(yīng)編碼格式的文件中去。如果輸出的內(nèi)容是以追加的方式,那么需要保證前后兩個(gè)輸出文件內(nèi)容的編碼格式一樣,否則也會(huì)出現(xiàn)亂碼。假如之前的輸出文件是GBK格式,你使用字符輸出流輸出的字符格式為UTF8并追加到文件中去,這個(gè)時(shí)候亂碼就產(chǎn)生了。綜上過(guò)程,也就知道大家為什么又稱FileOutputStream和InputStreamReader為轉(zhuǎn)換流了。
傳遞給字符流的字節(jié)流不需要單獨(dú)的進(jìn)行關(guān)系,在字符流關(guān)閉的時(shí)候會(huì)調(diào)用字節(jié)流的close()方法。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java常用io文件流的基本使用”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)