前面介紹了如何應用輸入流FileInputStream從本地文件讀取數據。本節介紹應用輸出流FileOutputStream把數據寫入本地文件。
用FileOutputStream寫入文件流程如下:
使用FileOutputStream寫入文件的過程同使用FileInputStream過程相同,都是先用File類打開本地文件,實例化輸入輸出流,然後調用流的讀寫方法讀取或寫入數據,最後關閉流。
FileOutputStream的構造方法
FileOutputStream提供了4個常用構造方法,用於實例化FileOutputStream對象,不同的場景使用不同的構造方法。
場景1:使用File對象打開本地文件,從文件讀取數據。
場景2:不使用File對象,直接傳入文件路徑。
FileOutputStream的構造方法允許直接傳入文件路徑,而無須使用File對象。查看該構造方法的原始碼,其內部使用了File對象打開文件。
場景3:打開文件,在文件的尾部追加寫入數據。
場景要求在文件的尾部寫入數據,由於前面兩個構造函數都是文件開始寫入數據(覆蓋原文件),因此不能使用前面2個場景的構造函數。FileOutputStream提供了另外兩個構構造方法,分別是:
FileOutputStream(File file, boolean append);
FileOutputStream(String name, boolean append);
同前面的構造方法相比,這兩個構造方法各多了一個boolean參數append。append參數為true時,數據從文件尾部寫入;append參數為false時,數據覆蓋原文件。
FileOutputStream的寫入方法
FileOutputStream類提供了多種文件寫入方法,可以單獨寫一個字節到文件,也可以寫一個byte數組到文件,也可以取byte數組的部分數據寫入到文件。
例1:使用write(int b)方法寫入文件。
例子程序首先調用File類的createNewFile()創建new.txt文件,然後將str內容寫入到新創建的new.txt文件中。
例2:使用write(byte[] b)方法寫入文件。
write(byte[] b)方法用於將b.length個字節從指定的byte數組寫入到輸出流。
String類的getBytes()方法可以將字符串轉換為byte數組,使用FileOutputStream 類的write(byte[] b)方法,將轉換的byte數組寫入文件。
例3:使用write(byte[] b,int off,int len)方法寫入文件。
該方法將len個字節的數據,並從數組b的off位置開始寫入到輸出流。
程序把指定的str內容寫入到文件,fos.write(str.getBytes(),5,10)語句的第一個參數為byte數組,第二個參數5是從byte數組的下標5開始,第三個參數是寫入的字節數。程序執行後,寫入的內容為「is new file」。
使用該方法一定要注意數組越界的問題。例如,byte數組長度為20,從第下標12開始,寫入15個字節到文件,就會造成數組越界,程序報錯。
例4:使用FileOutputStream複製文件
複製文件是將源文件數據寫入到新文件,在實際編程中,實現文件的複製有很多種方法,本案例使用FileInputStream和FileOutputStream實現文件的複製。
代碼中的copyFile完成文件的複製,在複製之前,先判斷一下源文件是否存在,然後申請一個byte數組,用於存儲讀取的源文件數據,該數組大小與源文件總字節數相同,讀取成功後,再將數組內容寫入到目標文件。程序輸出結果如下圖所示:
■ 知識點撥
使用FileOutputStream流可以寫入字節數據到目標文件,FileOutputStream提供了單字節寫入和byte數組寫入兩種方式。建議使用byte數組寫入,將待寫入的數據存儲到一個byte數組中,然後再寫入文件。當寫入的文件已經存在時,需要指明寫入方式是覆蓋還是追加。