在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

  所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

 

  • import java.io.*; 
  • import java.util.*; 
  •  
  • public class Logon implements Serializable { 
  •        private Date date = new Date(); 
  •        private String username; 
  •        private transient String password; 
  •  
  •        Logon(String name, String pwd) { 
  •               username = name; 
  •               password = pwd; 
  •        } 
  •  
  •        public String toString() { 
  •               String pwd = (password == null) ? "(n/a)" : password; 
  •               return "logon info:   " + "username: " + username + "  date: " + date + "  password: " + pwd; 
  •        } 
  •  
  •        public static void main(String[] args) throws IOException, ClassNotFoundException { 
  •               Logon a = new Logon("Morgan", "morgan83"); 
  •               System.out.println( "logon a = " + a); 
  •               ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out")); 
  •               o.writeObject(a); 
  •               o.close(); 
  •               int seconds = 5; 
  •               long t = System.currentTimeMillis() + seconds * 1000; 
  •               while(System.currentTimeMillis() < t) ; 
  •               ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out")); 
  •               System.out.println( "Recovering object at " + new Date()); 
  •               a = (Logon)in.readObject(); 
  •               System.out.println("logon a = " + a); 
  •        } 
  • }

  类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法可以了。

  需要说明一点,对象序列化有一个神奇之处是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。

  关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

  对Java的输入输出功能,浅浅的介绍到这里,本文的目的只是开一个好头,希望能让大家对Java输入输出流有个基本的认识。