對象流
ObjectInputStream ObjectOutputStream類分別是InputStream和OutputStream的子類,對象輸出流使用writeObject(Object obj)方法,將一個對象obj寫入到一個文件,使用readObject()讀取一個對象。
構造方法:
ObjectInputStream (InputStream in)
ObjectOutputStream(OutputStream out)
當准備將一個對象寫入文件的時候,首先用OutputStream的子類創建一個輸出流。
OutputStream outStream = new FileOutputStream("file_name");
ObjectOutputStream objstream = new ObjectOutputStream(outStream);
當使用對象流寫入或者讀取對象的時候,必須保證該對象是序列化的,這樣是為了保證對象能夠正確的寫入文件,並能夠把對象正確的讀回程序。
所謂的對象的序列化就是將對象轉換成二進制數據流的一種實現手段,通過將對象序列化,可以方便的實現對象的傳輸及保存。在Java中提供了ObejctInputStream 和ObjectOutputStream這兩個類用於序列化對象的操作。用於存儲和讀取對象的輸入輸出流類,要想實現對象的序列化需要實現Serializable接口,但是Serializable接口中沒有定義任何的方法,僅僅被用作一種標記,以被編譯器作特殊處理。
1 package project; 2 import java.io.*; 3 //實現Serializable 接口 4 class TV implements Serializable{ 5 /** 6 * 7 */ 8 private static final long serialVersionUID = 1597309922188243103L; 9 String name; 10 int price; 11 public void setName(String name){ 12 this.name = name; 13 } 14 public void setPrice(int price){ 15 this.price = price; 16 } 17 public String getName() { 18 return name; 19 } 20 public int getPrice() { 21 return price; 22 } 23 24 } 25 public class Main{ 26 public static void main(String[] args) { 27 TV changhongTv = new TV(); 28 changhongTv.setName("長虹電視"); 29 changhongTv.setPrice(5678); 30 File file = new File("changhong"); 31 try { 32 //序列化寫入文件 33 OutputStream outputStream = new FileOutputStream(file); 34 ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); 35 objectOutputStream.writeObject(changhongTv); 36 objectOutputStream.close(); 37 38 //序列化讀取對象 39 InputStream inputStream = new FileInputStream(file); 40 ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); 41 TV xinfeiTv = (TV)objectInputStream.readObject(); 42 objectInputStream.close(); 43 44 45 xinfeiTv.setName("新飛電視"); 46 xinfeiTv.setPrice(6666); 47 48 System.out.println("changhong name "+changhongTv.getName()); 49 System.out.println("changhong price "+changhongTv.getPrice()); 50 51 System.out.println("xinfei name "+xinfeiTv.getName()); 52 System.out.println("xinfei price "+xinfeiTv.getPrice()); 53 54 } catch (ClassNotFoundException e) { 55 // TODO: handle exception 56 System.out.println("不能讀取對象"); 57 }catch (IOException e) { 58 // TODO: handle exception 59 System.out.println(e); 60 } 61 } 62 }
對象的序列化的實現方便了對象間的克隆,使得復制品實體的變化不會引起原對象實體的變化。
下面是一個實例:
另外,Java.awt包中的Componet類是實現Serializable接口的類,因此程序可以實現把組件寫入輸出流,然后用輸入流讀取該組件的克隆。