基礎複習2-IO流
IO流(任何流寫預設都是覆蓋)
一、什麼流就用什麼陣列接收,位元組流byte[] b = reader.read(),位元組流char[] c = reader.read()
二、亞太地區編碼GBK,reader.getEncoding() = GBK,idea預設格式GBK會導致讀取中文檔案錯誤,找不到檔案
三、File->setting->Editor->File Encoding 改編碼
四、理論上java不存在記憶體洩漏,因為存在GC機制,當引用變數,物件資訊在使用完畢後會自動呼叫gc實現記憶體的回收。但是如果在程式中使用了第三方資源,比如檔案,網路,資料庫連線等一些資源,GC無法回收,需要主動close
五、轉換流用於位元組與字元流相互轉換
- 位元組流轉字元流:輸入Reader reader = new InputStreamReader(System.in);// 裝飾器模式
- 字元流轉位元組流:輸出Writer writer = new OutputStreamWriter(new FileOutputStream(File, true));
六、高階流,不用定義緩衝區大小了,直接讀一行
BufferedReader:一般用於讀,可以一次讀一行
BufferedWriter
BufferedInputStream
BufferedOutStream
七、列印流,只包含輸出流,不會丟擲任何IOException(一般用於寫,一次可以寫一行)例:
PrintStream:位元組列印(位元組輸出),ps = new PrintStream(new File(“src/a.txt“)),pw.println(“字串”); pw.writer(“字串”.getBytes());
PrintWriter:字元列印流呼叫println方法時,一定要呼叫重新整理flush(),或者pw = new PrintWriter(new FileOutputStream(new File(), append:true), true),否則檔案不會寫入資料。呼叫writer方法時,在使用了true的同時還要呼叫close或者flush,否則還是不會寫入資料。
使用flush的原因,資料存在於緩衝區中,呼叫flush將資料寫入檔案中。
列印流和Buffered流互相裝飾pw = new PrintWriter(new FileWriter(new File(“src/a.txt”)))
八、追加輸出 new FileOutputStream(File, true);在檔案末尾追加輸出,不加true覆蓋
九、隨機訪問流:往檔案中間加資料,例如斷網後下次下載要從上次下載的地方開始繼續下。
RandomAccessFile特性:隨機訪問檔案流,可以從檔案的任意位置進行讀與寫,並且能夠對java的基本資料型別進行直接讀寫。
RandomAccessFile raf_read = new RandomAccessFile(file, "r");//可讀
RandomAccessFile raf_write = new RandomAccessFile(new File(dir, file.getName()), "rw");//可讀可寫
raf_read .seek(long position);//定位到position開始讀取 position的單位是位元組
十、物件的序列化與反序列化1:物件序列化就是將一個java物件直接儲存到檔案,網路,等其他的儲存介質中
實現步驟:1、讓需要序列化的物件所屬的類實現serializable介面
2、通過物件輸出流(ObjectOutputStream.writeObject(object))將java物件寫入檔案
特性:只儲存屬性,不儲存方法。Transient和static修飾的屬性不被序列化
物件的序列化與反序列化2:
實現步驟:1、讓需要序列化的物件所屬的類實現Externalizable介面
2、重寫writeExternal和readExternal方法
3、通過物件輸出流將java物件寫入檔案
特性:只儲存屬性,不儲存方法。Transient和static修飾的屬性不被序列化