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í)候又稱(chēng)它們?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ò)程 , 也就知道大家為什么又稱(chēng) FileOutputStream 和 InputStreamReader 為轉(zhuǎn)換流了 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- java入門(mén)基礎(chǔ)知識(shí) java算法題面試
- java解壓各種類(lèi)型的文件 java解壓zip文件為空
- 講解java部署jar還是war優(yōu)劣 jar運(yùn)行命令
- java程序員必備的基礎(chǔ)知識(shí) java截取字符串后幾位
- 哪個(gè)培訓(xùn)班靠譜?想要培訓(xùn)Java的應(yīng)該如何選擇? 程序員編程培訓(xùn)
- 自學(xué)java堅(jiān)持不下去了,要找Java培訓(xùn)機(jī)構(gòu)嗎 程序員編程培訓(xùn)
- 簡(jiǎn)單好玩的編程代碼 javascriptvoid怎么解決
- 教你javascript實(shí)時(shí)獲取鼠標(biāo)位置 js獲取鼠標(biāo)點(diǎn)擊的位置
- 你做 Java 程序員真的是因?yàn)闊釔?ài)嗎? 程序員編程培訓(xùn)
- Java基本數(shù)據(jù)類(lèi)型 java字符串拆分為數(shù)組
