注意:字節數組流是可以不用關閉的(字符數組流要不要關閉暫時不清楚)。
對象流的讀數據和寫數據方法分別是writeObject(Object o)和readObject(Object o)。
ObjectInputStream和ObjectOutputStream類分別是InputStream和OutputStream類的子類。ObjectInputStream和ObjectOutputStream類創建的對象稱為輸入流和對象輸出流,對象輸出流使用writeObject(Object obj)方法將一個對象obj寫入到一個文件,對象輸入流使用readObject()讀取一個對象到程序中。
ObjectInputStream和ObjectOutputStream類的構造方法如下。
- ObjectInputStream(InputStream in)
- ObjectOutputStream(OutputStream out)
ObjectOutputStream的指向應當是一個輸出流對象,因此當准備將一個對象寫入到文件時,首先用OutputStream的子類創建一個輸出流。例如:
FileOutputStream fileOut = new FileOutputStream(file);//對於對象流而言,這應該是底層流 ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
同樣ObjectInputStream的指向應當是一個輸入流對象,因此當准備從文件中讀入一個對象到程序中時,首先用InputStream的子類創建一個輸入流,例如用FileInputStream創建一個文件輸入流,如下所示:
FileInputStream fileIn = new FileInputStream(file); ObjectInputStream objectIn = new ObjectInputStream(fileIn);
當使用對象流寫入或讀入對象時,要保證對象是序列化的,這是為了保證能把對象寫入到文件,並能再把對象正確讀回到程序中。
一個類如果實現了Serializable接口(java.io包中的接口),那么這個類創建的對象流是所謂序列化的對象。
Java類庫提供的絕大多數對象都是所謂序列化的。Serializable接口中沒有方法,因此實現該接口的類不需要實現額外的方法。使用對象流把一個對象寫入到文件時不僅要保證該對象是序列化的,而且該對象的成員對象也必須是序列化的。
Serializable接口中的方法對程序是不可見的,因此實現該接口的類不需要實現額外的方法,當把一個序列化的對象寫入到對象輸出流時,JVM就會實現Serializable接口中的方法,將一定格式的文本(對象的序列化信息)寫入到目的地。當ObjectInputStream對象流從文件讀取對象時,就會從文件中讀回對象的序列化信息,並根據對象的序列化信息創建一個對象。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Test03 { public static void main(String[] args) { // TODO Auto-generated method stub TV changhong = new TV(); changhong.setName("changhongTV"); changhong.setPrice(5678); File file = new File("E:/test/television.txt"); try { FileOutputStream fileOut = new FileOutputStream(file);//對於對象流而言,這應該是底層流 ObjectOutputStream objectOut = new ObjectOutputStream(fileOut); objectOut.writeObject(changhong); objectOut.close(); FileInputStream fileIn = new FileInputStream(file); ObjectInputStream objectIn = new ObjectInputStream(fileIn); TV xinfei = (TV)objectIn.readObject(); objectIn.close(); xinfei.setName("新飛電視"); xinfei.setPrice(6666); System.out.println("changhong的名字:" + changhong.getName()); System.out.println("changhong的價格:" + changhong.getPrice()); System.out.println("xinfei的名字:" + xinfei.getName()); System.out.println("xinfei的價格:" + xinfei.getPrice()); } catch (IOException e) {} catch (ClassNotFoundException e) { // TODO Auto-generated catch block System.out.println("不能輸出對象"); } } }
將對象的信息寫入文件television.txt,然后用ObjectOutputStream對象取出數據並顯示。
程序運行之后,結果如下所示:
TV.java如下所示,TV類時要實現Serializable接口的。
import java.io.Serializable; public class TV implements Serializable{ String name; int price; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }