1. 程式人生 > >Java關鍵字transient和java物件流

Java關鍵字transient和java物件流

transient和volatile兩個關鍵字一個用於物件序列化簡單總結一下。

transient

transient是型別修飾符,只能用來修飾字段。在物件序列化的過程中,標記為transient的變數不會被序列化。

示例:

class Test {

transient int a; // 不會被持久化

int b; // 持久化

}

當類Test的例項物件被序列化(比如將Test類的例項物件 t 寫入硬碟的文字檔案t.txt中),變數 a 的內容不會被儲存,變數 b 的內容則會被儲存。

參考:
把一個物件的表示轉化為位元組流的過程稱為序列化(也稱為序列化,serialization),從位元組流中把物件重建出來稱為反序列化(也稱為為反序列化,deserialization)。transient 為不應被序列化的資料提供了一個語言級的標記資料方法。

 我們知道Java中對檔案操作有6種流:

             1 檔案位元組流:這是InputStream和OutputStream的子類 eg: FileInputStream  FileOutputStream

             2 檔案字元流    這是Reader和Writer的其子類  eg:FileReader    FileWriter    

             3 緩衝流   BufferReader類建立的物件稱為緩衝輸入流,該輸入流的指向必須是一個Reader流,稱為BufferReader的底層流,底層流負責將資料讀入到緩衝區,BufferReader流的源就是這個緩衝區,緩衝輸入流再從緩衝區讀取資料;同樣的, BufferWriter類建立的物件稱為緩衝輸出流,該輸入流的指向必須是一個Writer流,稱為BufferWriter的底層流,BufferWriter流負責將資料寫入到緩衝區,底層流的源就是這個緩衝區,底層流

再從緩衝區寫入資料到目的地

            4 資料流    DataInputStream和DataOutputStream建立的物件稱為資料輸入流和資料輸出流,這兩個流允許程式按照與機器無關的風格讀取Java原始資料。也就是說我們讀取一個數值時候,不必關心這個數值應當是多少位元組。

            5 物件流    ObjectInputStream和ObjectOutputStream類分別是InputStream和OutputStream的子類。ObjectInputStream和ObjectOutputStream建立的物件稱為物件輸入流和物件輸出流,物件輸出流使用WriteObject(Object obj)方法將一個物件Obj寫入輸出流送往目的地,物件輸入流則使用readObject()方法從源中讀取一個物件到程式中。下面我著重講解物件流

         當我們使用物件流寫入或者讀取物件時,要保證物件是序列化的,這是為了保證能把物件寫入到檔案,並且從檔案中正確讀取到程式中。一個類如果實現了Serializable介面,那麼這個類建立的物件就是序列化的物件,Serializable介面中的方法對程式是不可見的,因此實現該介面的類不需要實現額外的方法,當把一個序列化的物件寫入到物件輸出流的時候,JVM會自動的實現Serializable介面中的方法,按照一定格式的文字將物件寫入到目的地。

但是我們應該明確,物件流寫入到檔案是以16進位制儲存的,因此使用普通的編輯器開啟(word,記事本)會亂碼,物件流本來就是適合網路之間的傳輸。

      另外我們必須要明確是:使用readObject()只能從檔案中讀取一個一次,不能像BufferReader的readLine()方法一樣可以迴圈控制中讀取輸入,也就是說如果檔案中存在多個物件,那麼只是讀取第一個物件,例如:

  1. package inputoutputStream;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.ObjectInputStream;  
  8. import java.io.ObjectOutputStream;  
  9. import java.io.Serializable;  
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12.  class TV implements Serializable{  
  13.     privateint price;  
  14.     privatedouble weigth;  
  15.     private String describe;  
  16.     privateboolean isNice;  
  17.      List<List<String>> list;  
  18.     public TV(){  
  19.         list=new ArrayList<>();  
  20.         for(int i=0;i<10;i++)  
  21.             list.add(new ArrayList<String>());  
  22.     }  
  23.     public List<List<String>> getList() {  
  24.         return list;  
  25.     }  
  26.     publicvoid setList(List<List<String>> list) {  
  27.         this.list = list;  
  28.     }  
  29.     publicint getPrice() {  
  30.         return price;  
  31.     }  
  32.     publicvoid setPrice(int price) {  
  33.         this.price = price;  
  34.     }  
  35. publicdouble getWeigth() {  
  36.         return weigth;  
  37.     }  
  38.     publicvoid setWeigth(double weigth) {  
  39.         this.weigth = weigth;  
  40.     }  
  41.     public String getDescribe() {  
  42.         return describe;  
  43.     }  
  44.     publicvoid setDescribe(String describe) {  
  45.         this.describe = describe;  
  46.     }  
  47.     publicboolean isNice() {  
  48.         return isNice;  
  49.     }  
  50.     publicvoid setNice(boolean isNice) {  
  51.         this.isNice = isNice;  
  52.     }  
  53. }  
  54. publicclass ObjectStream {  
  55.     private TV t;  
  56.     privatefinalstatic String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";  
  57.     public ObjectStream(){  
  58.         t=new TV();  
  59.         t.setNice(true);  
  60.         t.setDescribe("very nice~~");  
  61.         t.setPrice(800);  
  62.         t.setWeigth(200.23);  
  63.         for(int i=0;i<10;i++){  
  64.             for(int j=0;j<4;j++)  
  65.                 t.list.get(i).add("["+(i+3)+","+j+"]");  
  66.         }  
  67.     }  
  68.     publicvoid write(TV tv) throws FileNotFoundException, IOException{  
  69.         File file=new File(OUTPUT);  
  70.         /*TV []data=new TV[2]; 
  71.         data[0]=tv;data[1]=tv;*/
  72.         ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));  
  73.         //objectOutputStream.writeObject(data);
  74.         objectOutputStream.writeObject(tv);  
  75.         objectOutputStream.close();  
  76.         System.out.println("write over~!~~");  
  77.     }  
  78.     publicvoid read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{  
  79.         File file=new File(OUTPUT);  
  80.         ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));  
  81.         TV v=(TV) inputStream.readObject();  
  82.         //List<TV> s=new ArrayList<>();
  83.         //TV vv[]= (TV[]) inputStream.readObject();
  84.         //TV []vv=(TV[])inputStream.readObject();
  85.         //for(TV v:vv){
  86.             System.out.println(v.getDescribe());  
  87.             System.out.println(v.getPrice());  
  88.             System.out.println(v.isNice());  
  89.             System.out.println(v.getWeigth());  
  90.             System.out.println(v.getList());  
  91.         //}
  92.     }  
  93.     publicvoid writeChar() throws Exception{  
  94.         String output="C:\\Users\\samsung\\Desktop\\ww.txt";  
  95.         String s="上來的飛機上開發是卡洛斯的房間裡誰";  
  96.         File file=new File(output);  
  97.         FileOutputStream stream=