暑期自學 Day 05 | File 類 和 IO 流(五)

Borris發表於2020-05-09

用緩衝流複製檔案(讀寫檔案)

  • 示例程式碼如下:
    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() 讀取一整行,到行末尾返回空

轉換流 (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 協議》,轉載必須註明作者和本文連結

相關文章