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()方法一樣可以迴圈控制中讀取輸入,也就是說如果檔案中存在多個物件,那麼只是讀取第一個物件,例如:
- package inputoutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- class TV implements Serializable{
- privateint price;
- privatedouble weigth;
- private String describe;
- privateboolean isNice;
- List<List<String>> list;
- public TV(){
- list=new ArrayList<>();
- for(int i=0;i<10;i++)
- list.add(new ArrayList<String>());
- }
- public List<List<String>> getList() {
- return list;
- }
- publicvoid setList(List<List<String>> list) {
- this.list = list;
- }
- publicint getPrice() {
- return price;
- }
- publicvoid setPrice(int price) {
- this.price = price;
- }
- publicdouble getWeigth() {
- return weigth;
- }
- publicvoid setWeigth(double weigth) {
- this.weigth = weigth;
- }
- public String getDescribe() {
- return describe;
- }
- publicvoid setDescribe(String describe) {
- this.describe = describe;
- }
- publicboolean isNice() {
- return isNice;
- }
- publicvoid setNice(boolean isNice) {
- this.isNice = isNice;
- }
- }
- publicclass ObjectStream {
- private TV t;
- privatefinalstatic String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";
- public ObjectStream(){
- t=new TV();
- t.setNice(true);
- t.setDescribe("very nice~~");
- t.setPrice(800);
- t.setWeigth(200.23);
- for(int i=0;i<10;i++){
- for(int j=0;j<4;j++)
- t.list.get(i).add("["+(i+3)+","+j+"]");
- }
- }
- publicvoid write(TV tv) throws FileNotFoundException, IOException{
- File file=new File(OUTPUT);
- /*TV []data=new TV[2];
- data[0]=tv;data[1]=tv;*/
- ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));
- //objectOutputStream.writeObject(data);
- objectOutputStream.writeObject(tv);
- objectOutputStream.close();
- System.out.println("write over~!~~");
- }
- publicvoid read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{
- File file=new File(OUTPUT);
- ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));
- TV v=(TV) inputStream.readObject();
- //List<TV> s=new ArrayList<>();
- //TV vv[]= (TV[]) inputStream.readObject();
- //TV []vv=(TV[])inputStream.readObject();
- //for(TV v:vv){
- System.out.println(v.getDescribe());
- System.out.println(v.getPrice());
- System.out.println(v.isNice());
- System.out.println(v.getWeigth());
- System.out.println(v.getList());
- //}
- }
- publicvoid writeChar() throws Exception{
- String output="C:\\Users\\samsung\\Desktop\\ww.txt";
- String s="上來的飛機上開發是卡洛斯的房間裡誰";
- File file=new File(output);
- FileOutputStream stream=