_053_FileOutPutStream位元組輸出流
=======================
FileOutPutStream 1 找到目標檔案 2 建立資料的輸出通道 3 把資料轉換成位元組陣列寫出 4 關閉資源
輸出位元組流: public abstract class OutPutStream-此抽象類是表示位元組輸入流的所有類的父類 且是抽象類,必須要用它的子類建立物件,我們要寫檔案,那麼就是FileOutPutStream
方法:
void write(byte[] b)
將 b.length 個位元組從指定 byte 陣列寫入此檔案輸出流中。
void write(int b)
將指定位元組寫入此檔案輸出流。
void write(byte[] b, int off, int len)
將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此檔案輸出流
建構函式 FileOutputStream(File file) 建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流。 FileOutputStream(File file, boolean append) 建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流。第二個引數為true時,則將位元組寫到檔案末尾處,不清空 每次建立一個FileOutputStream物件,那麼指標就會指到檔案開頭的位置,那麼每次都會覆蓋前面的內容,而我們如果加了true 那麼就代表指標始終在檔案的末尾
注意:
1 使用FileOutputStream建立物件的時候,如果File檔案不存在,就是說a.txt不存在,那麼會自動建立
如果檔案存在則會把裡面的內容會清空,要想裡面的內容不清空,需要把FileOutputStream建構函式的
第二個引數填寫成true
2 檔案末尾處,表示的是游標所在的末尾處,如果我們在a.txt裡面輸入回車,那麼再執行下面的程式碼,就是從回車處開始寫資料
3 使用FileOutputStream的write方法寫資料的時候,雖然接受的是int型別的資料,但是真正寫出的
只是一個位元組的資料,只是把低八位的二進位制資料寫出,其它二十四位全部拋棄,低8位也就是一個位元組。
也就是說,如果是這樣寫fou1.write('我');一個漢字是佔2個位元組的,也就是說,有一半資料被切割了,所以我們輸出後看到的是亂碼
讀取也是一個道理,每次只讀一個位元組,讀漢字當然亂碼。
4 但是如果用了data.getBytes()方法轉換後成的陣列就不一樣的,因為這時候是呼叫了這個方法void write(byte[] b) ,所以可以寫出正常漢字
class Test { public static void main(String[] args) throws IOException { test2(); } public static void test1() throws IOException { File file1 = new File("D:\\a.txt"); FileOutputStream fou1 = new FileOutputStream(file1); fou1.write('我');// 輸出是亂碼 fou1.write(97); fou1.write(98); fou1.write(99); fou1.close(); } public static void test2() throws IOException { File file1 = new File("D:\\a.txt"); FileOutputStream fou1 = new FileOutputStream(file1, true); String data = "\r\n嗚嗚嗚嗚嗚"; fou1.write(data.getBytes()); fou1.close(); } }