ObjectInputStream和ObjectOutputStream類分別是InputStream和OutputStream類的子類。ObjectInputStream和ObjectOutputStream類創(chuàng)建的對象稱為對象輸入流和對象輸出流。對象輸出流使用writeObject(Object obj)方法將一個對象obj寫入到一個文件,對象輸入流使用readObject()讀取一個對象到程序中。
ObjectInputStream和ObjectOutputStream類的構(gòu)造方法如下:
1)ObjectInputStream(InputStream in)
2)ObjectOutputStream(OutputStream out)
ObjectOutputStream的指向應(yīng)當是一個輸出流對象,因此當準備將一個對象寫入到文件時,首先用OutputStream的子類創(chuàng)建一個輸出流。
例如,用FileOutputStream創(chuàng)建一個文件輸出流,代碼如下:
FileOutputStream fileOut = new FileOutputStream("tom.txt"); ObjectOutputStream objectout = new ObjectOutputStream(fileOut);
同樣ObjectInputStream的指向應(yīng)當是一個輸入流對象,因此當準備從文件中讀入一個對象到程序中時,首先用InputStream的子類創(chuàng)建一個輸入流。
例如,用FileInputStream創(chuàng)建一個文件輸入流,代碼如下:
FileInputStream fileIn = new FileInputStream("tom.txt"); ObjectInputStream objectIn = new ObjectInputStream(fileIn);
當使用對象流寫入或讀入對象時,要保證對象是序列化的,這是為了保證能把對象寫入到文件,并能再把對象正確讀回到程序中。
一個類如果實現(xiàn)了Serializable接口(java.io包中的接口),那么這個類創(chuàng)建的對象就是所謂序列化的對象。Java類庫提供的絕大多數(shù)對象都是所謂序列化的。需要強調(diào)的是,Serializable接口中沒有方法,因此實現(xiàn)該接口的類不需要實現(xiàn)額外的方法。另外需要注意的是,使用對象流把一個對象寫入到文件時不僅要保證該對象是序列化的,而且該對象的成員對象也必須是序列化的。
Serializable接口中的方法對程序是不可見的,因此實現(xiàn)該接口的類不需要實現(xiàn)額外的方法,當把一個序列化的對象寫入到對象輸出流時,JVM就會實現(xiàn)Serializable接口中的方法,將一定格式的文本(對象的序列化信息)寫入到目的地。當ObjectInputStream對象流從文件讀取對象時,就會從文件中讀回對象的序列化信息,并根據(jù)對象的序列化信息創(chuàng)建一個對象。
例如,使用對象流讀寫TV類創(chuàng)建的對象:
TV.java
import java.io.*; public class TV implements Serializable { String name; int price; public void setName(String s) { name = s; } public void setPrice(int n) { price = n; } public String getName() { return name; } public int getPrice() { return price; } }
Main.java
import java.io.*; public class Main { public static void main(String args[]) { TV changhong = new TV(); changhong.setName("長虹電視"); changhong.setPrice(5678); File file = new File("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(ClassNotFoundException event) { System.out.println("不能讀出對象"); } catch(IOException event) { System.out.println(event); } } }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程