对象流
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接口的类,因此程序可以实现把组件写入输出流,然后用输入流读取该组件的克隆。