用緩衝流複製檔案(讀寫檔案)
- 示例程式碼如下:
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://test//in.txt"); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d://test//out.txt"))) { int len = 0; byte[] bytes = new bytes[1024]; // 用於連續讀取的位元組陣列 while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); } } catch (IoException e) { e.printStackTrace(); }
字元緩衝流 (BufferedRead, BufferedWriter)
- 構造方法和位元組緩衝流一樣,使用方法和字元流一樣。
- 特有方法
- BufferedWriter:
public void newLine()
換行分隔符方法 - BUfferedReader:
public String readLine()
讀取一整行,到行末尾返回空
- BufferedWriter:
轉換流 (InputStreamReader, OutputStreamWriter)
為了解決編碼亂碼問題
除了查詢預設碼錶 UTF-8:
- InputStreamReader 也可以查詢指定碼錶,將位元組流轉換為字元流。子類:FileReader
- OutputStreamWriter 查詢指定碼錶,將字元流轉換為位元組流。子類:FileWriter
使用示例:
// 使用時均要宣告 IOException 異常 // OutputStreamWriter // 將位元組輸出流傳遞進osw,指定編碼格式 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d://test.txt"), "utf-8"); // 將字串寫入 osw.write("你好"); // 重新整理釋放資源 osw.flush(); osw.close(); // InputStreamReader // 將位元組輸入流傳遞進isr,指定解碼格式 InputStreamReader isr = new InputStreamReader(new FileInputStream("d://test.txt"),"utf-8"); int len = 0; byte[] bytes = new byte[1024]; while ((len = isr.read(bytes)) != -1) { System.out.println((char)len); } isr.close();
序列化和反序列化
- 序列化:把物件以流的形式寫入到檔案儲存;ObjectOutputStream
- 反序列化:把檔案中儲存的物件用流的形式讀取出來;ObjectInputStream
- 進行序列化反序列化時,必須實現 Serializable 介面。
序列化流 ObjectOutputStream
- 繼承了位元組輸出流
- 特有成員方法
- void writeObject(Object obj)
反序列化流 ObjectInputStream
- 繼承了位元組輸入流
- 特有成員方法
- void readObject(Object obj)
- 使用時要丟擲 ClassNotFoundException
瞬態關鍵字 (transient)
- 靜態關鍵字不屬於物件,無法被序列化。
- 使用 transient 修飾變數,可以使成員變數不被序列化。
InvalidClassException
- 序列化時會產生一個序列號,如果 class 中做了修改,反序列化時會造成序列號不一致,導致異常
- 解決:在類中指定序列號,如:
private static final long serialVersionUID = 1L;
列印流 (PrintStream)
- System.out.println() 就是一個列印流
- 不會丟擲 IOException
- 特有方法:print(), println(); 括號裡可以列印任意資料型別
- 構造方法:
- PrintStream(File file)
- PrintStream(String filename)
- PrintStream(OutputStream out)
- 可以看出,列印流既可以輸出到檔案,也可以輸出到流物件
- 繼承了父類 write(), read(), flush(), close() 等方法。
- 程式碼示例:
PrintStream ps = new PrintStream("d://test.txt"); // 要處理 FileNotFoundException
ps.write(97); // a
ps.println(97); // 97
System.setOut(ps); // 使列印流在目的地檔案中輸出
System.out.print(97); // test.txt 中列印 97
ps.close();
本作品採用《CC 協議》,轉載必須註明作者和本文連結