java FileOutputStream輸出流的使用解讀
FileOutputStream的構(gòu)造方法
FileOutputStream提供了4個(gè)常用構(gòu)造方法,用于實(shí)例化FileOutputStream對(duì)象,
不同的場(chǎng)景使用不同的構(gòu)造方法。
場(chǎng)景1
使用File對(duì)象打開(kāi)本地文件,從文件讀取數(shù)據(jù)。
public FileOutputStream(File file) throws FileNotFoundException{}
查看底層源碼發(fā)現(xiàn)該構(gòu)造方法實(shí)際是調(diào)用了另一個(gè)構(gòu)造方法
public FileOutputStream(File file) throws FileNotFoundException { ? ? ? ? this(file, false); ? ? }
場(chǎng)景2
不使用File對(duì)象,直接傳入文件路徑。
public FileOutputStream(String name) throws FileNotFoundException{}
FileOutputStream的構(gòu)造方法允許直接傳入文件路徑,而無(wú)須使用File對(duì)象。查看該構(gòu)造方法的源代碼,其內(nèi)部使用了File對(duì)象打開(kāi)文件。
場(chǎng)景3
打開(kāi)文件,在文件的尾部追加寫(xiě)入數(shù)據(jù)。
場(chǎng)景要求在文件的尾部寫(xiě)入數(shù)據(jù),由于前面兩個(gè)構(gòu)造函數(shù)都是文件開(kāi)始寫(xiě)入數(shù)據(jù)(覆蓋原文件),因此不能使用前面2個(gè)場(chǎng)景的構(gòu)造函數(shù)。FileOutputStream提供了另外兩個(gè)構(gòu)構(gòu)造方法,分別是:
public FileOutputStream(File file,boolean append) throws FileNotFoundException{} public FileOutputStream(String name,boolean append) throws FileNotFoundException{}
同前面的構(gòu)造方法相比,這兩個(gè)構(gòu)造方法各多了一個(gè)boolean參數(shù)append。
append參數(shù)為true時(shí),數(shù)據(jù)從文件尾部寫(xiě)入;append參數(shù)為false時(shí),數(shù)據(jù)覆蓋原文件。
這也是第一個(gè)方法調(diào)用的那個(gè)方法
FileOutputStream的寫(xiě)入方法
FileOutputStream類(lèi)提供了多種文件寫(xiě)入方法,可以單獨(dú)寫(xiě)一個(gè)字節(jié)到文件,
也可以寫(xiě)一個(gè)byte數(shù)組到文件,也可以取byte數(shù)組的部分?jǐn)?shù)據(jù)寫(xiě)入到文件。
例1
使用write(int b)方法寫(xiě)入文件。
package com.demo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo { ? ? public static void main(String[] args) throws IOException { ? ? ? ? File file = new File("d://new.txt"); ? ? ? ? try { ? ? ? ? ? ? file.createNewFile(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? try { ? ? ? ? ? ? FileOutputStream fileOutputStream = new FileOutputStream(file); ? ? ? ? ? ? String str = "this is new file"; ? ? ? ? ? ? for (int i = 0; i < str.length(); i++) { ? ? ? ? ? ? ? ? int b = (int)str.charAt(i); ? ? ? ? ? ? ? ? fileOutputStream.write(b); ? ? ? ? ? ? } ? ? ? ? } catch (FileNotFoundException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
例子程序首先調(diào)用File類(lèi)的createNewFile()創(chuàng)建new.txt文件,然后將str內(nèi)容寫(xiě)入到新創(chuàng)建的new.txt文件中。
例2
使用write(byte[] b)方法寫(xiě)入文件。
write(byte[] b)方法用于將b.length個(gè)字節(jié)從指定的byte數(shù)組寫(xiě)入到輸出流。
String類(lèi)的getBytes()方法可以將字符串轉(zhuǎn)換為byte數(shù)組,使用FileOutputStream 類(lèi)的write(byte[] b)方法,將轉(zhuǎn)換的byte數(shù)組寫(xiě)入文件。
package com.demo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo { ? ? public static void main(String[] args) throws IOException { ? ? ? ? File file = new File("d://new.txt"); ? ? ? ? try { ? ? ? ? ? ? file.createNewFile(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? try { ? ? ? ? ? ? FileOutputStream fileOutputStream = new FileOutputStream(file); ? ? ? ? ? ? String str = "this is new file"; ? ? ? ? ? ? fileOutputStream.write(str.getBytes()); ? ? ? ? } catch (FileNotFoundException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
例3
使用write(byte[] b,int off,int len)方法寫(xiě)入文件。
該方法將len個(gè)字節(jié)的數(shù)據(jù),并從數(shù)組b的off位置開(kāi)始寫(xiě)入到輸出流。
package com.demo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo { ? ? public static void main(String[] args) throws IOException { ? ? ? ? File file = new File("d://new.txt"); ? ? ? ? try { ? ? ? ? ? ? file.createNewFile(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? try { ? ? ? ? ? ? FileOutputStream fileOutputStream = new FileOutputStream(file); ? ? ? ? ? ? String str = "this is new file"; ? ? ? ? ? ? fileOutputStream.write(str.getBytes(),5,11); ? ? ? ? } catch (FileNotFoundException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
程序把指定的str內(nèi)容寫(xiě)入到文件,fos.write(str.getBytes(),5,10)語(yǔ)句的第一個(gè)參數(shù)為byte數(shù)組,第二個(gè)參數(shù)5是從byte數(shù)組的下標(biāo)5開(kāi)始,第三個(gè)參數(shù)是寫(xiě)入的字節(jié)數(shù)。程序執(zhí)行后,寫(xiě)入的內(nèi)容為“is new file”。
使用該方法一定要注意數(shù)組越界的問(wèn)題。例如,byte數(shù)組長(zhǎng)度為20,從第下標(biāo)12開(kāi)始,寫(xiě)入15個(gè)字節(jié)到文件,就會(huì)造成數(shù)組越界,程序報(bào)錯(cuò)。
例4
使用FileOutputStream復(fù)制文件
package com.demo; import java.io.*; public class Demo { ? ? public static void main(String[] args) { ? ? ? ? File source = new File("d://new.txt"); ? ? ? ? File dest = new File("d://new2.txt"); ? ? ? ? copy(source,dest); ? ? } ? ? public static void copy(File sor, File dest){ ? ? ? ? if(!sor.exists()){ ? ? ? ? ? ? System.out.println("源文件不存在"); ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? try { ? ? ? ? ? ? FileInputStream in = new FileInputStream(sor); ? ? ? ? ? ? FileOutputStream out = new FileOutputStream(dest); ? ? ? ? ? ? byte[] buf = new byte[in.available()]; ? ? ? ? ? ? in.read(buf); ? ? ? ? ? ? out.write(buf); ? ? ? ? ? ? out.flush(); ? ? ? ? ? ? out.close(); ? ? ? ? ? ? in.close(); ? ? ? ? } catch (FileNotFoundException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
復(fù)制文件是將源文件數(shù)據(jù)寫(xiě)入到新文件,在實(shí)際編程中,實(shí)現(xiàn)文件的復(fù)制有很多種方法,本案例使用FileInputStream和FileOutputStream實(shí)現(xiàn)文件的復(fù)制。
java中的IO流中的輸出流一般都有flush這個(gè)操作,這個(gè)操作的作用是強(qiáng)制將緩存中的輸出流(字節(jié)流,字符流等)強(qiáng)制輸出。
為什么會(huì)有這么個(gè)方法?。?/strong>
因?yàn)檩敵隽髟谶M(jìn)行輸出時(shí),比如像某個(gè)文件中寫(xiě)入內(nèi)容,其實(shí)是先將輸出流寫(xiě)入到緩沖區(qū),當(dāng)緩沖區(qū)寫(xiě)滿(mǎn)后才將緩沖區(qū)的內(nèi)容輸出到文件中。但是當(dāng)主機(jī)完成輸出流的輸出后,有可能緩沖區(qū)這個(gè)時(shí)候還沒(méi)有被填滿(mǎn),這
樣的話(huà),就會(huì)一直等待主機(jī)發(fā)送內(nèi)容,這時(shí)候,就可以使用flush將緩沖區(qū)的內(nèi)容強(qiáng)制輸出到文件中,清空緩沖區(qū)。
所以,一般在關(guān)閉輸出流之前,要先調(diào)用flush方法強(qiáng)制緩沖區(qū)中的內(nèi)容輸出,并清空緩沖區(qū)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用建造者模式實(shí)現(xiàn)辦理手機(jī)套餐功能詳解
這篇文章主要介紹了Java使用建造者模式實(shí)現(xiàn)辦理手機(jī)套餐功能,較為詳細(xì)的描述了建造者模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用建造者模式實(shí)現(xiàn)的辦理手機(jī)套餐功能具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-05-05Java 實(shí)現(xiàn)Excel文檔添加超鏈接的代碼
超鏈接即內(nèi)容鏈接,通過(guò)給特定對(duì)象設(shè)置超鏈接,可實(shí)現(xiàn)載體與特定網(wǎng)頁(yè)、文件、郵件、網(wǎng)絡(luò)等的鏈接,點(diǎn)擊鏈接載體可打開(kāi)鏈接目標(biāo),在文檔處理中是一種比較常用的功能,本文將介紹通過(guò)Java程序給Excel文檔添加超鏈接的方法,感興趣的朋友一起看看吧2020-02-02Java面試題沖刺第十二天--數(shù)據(jù)庫(kù)(2)
這篇文章主要為大家分享了最有價(jià)值的三道數(shù)據(jù)庫(kù)面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-07-07struts2入門(mén)(搭建環(huán)境、配置、示例)詳解
這篇文章主要介紹了struts2入門(mén)(搭建環(huán)境、配置、示例)詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12