持久化就是将内存中的数据保存起来,使之可以长期存在。在JAVA中,我们可以把JAVA对象直接保存在文件中,在需要使用的时候,直接从文件中读取,这也是对象持久化的一种方式,在这一篇博客中,将演示两种将JAVA对象持久化到文件的方法,直接上代码:

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

/**
 * JAVA对象持久化
 * 
 * @author jianggujin
 * 
 */
public class JavaSerializable
{
   /**
    * 持久化为XML对象
    * 
    * @param obj
    * @param out
    */
   public void storeXML(Object obj, OutputStream out)
   {
      XMLEncoder encoder = new XMLEncoder(out);
      encoder.writeObject(obj);
      encoder.flush();
      encoder.close();
   }

   /**
    * 从XML中加载对象
    * 
    * @param in
    * @return
    */
   public Object loadXML(InputStream in)
   {
      XMLDecoder decoder = new XMLDecoder(in);
      Object obj = decoder.readObject();
      decoder.close();
      return obj;
   }

   /**
    * 持久化对象
    * 
    * @param obj
    * @param out
    * @throws IOException
    */
   public void store(Object obj, OutputStream out) throws IOException
   {
      ObjectOutputStream outputStream = new ObjectOutputStream(out);
      outputStream.writeObject(obj);
      outputStream.flush();
      outputStream.close();
   }

   /**
    * 加载对象
    * 
    * @param in
    * @return
    * @throws IOException
    * @throws ClassNotFoundException
    */
   public Object load(InputStream in) throws IOException,
         ClassNotFoundException
   {
      ObjectInputStream inputStream = new ObjectInputStream(in);
      Object obj = inputStream.readObject();
      inputStream.close();
      return obj;
   }

   public static void main(String[] args) throws Exception
   {
      String storeName = "java object";
      File xmlFile = new File("xmlFile.dat");
      JavaSerializable serializable = new JavaSerializable();
      serializable.storeXML(storeName, new FileOutputStream(xmlFile));
      System.out.println(serializable.loadXML(new FileInputStream(xmlFile)));
      File file = new File("file.dat");
      serializable.store(storeName, new FileOutputStream(file));
      System.out.println(serializable.load(new FileInputStream(file)));
   }
}

运行结果: 
java object 
java object

我们可以打开示例中生成的两个文件: 
xmlFile.dat 
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_45" class="java.beans.XMLDecoder"> 
<string>java object</string> 
</java>

file.dat 
 t java object

我们可以发现xmlFile.dat实际上将JAVA对象持久化成了XML文件,file.dat以一种特殊的格式进行持久化,以文本模式打开后,部分内容为乱码。

java对象持久化保存的方法小结

在实际java应用开发的过程中,经常会遇到需要持久保存java对象的情况,比如:用户信息、博客评论内容等等,本文针对java对象的持久化保存方法进行讨论,简述各个方法的优劣,供大家参考。

通常有三种可以选择的方法,如下:

  • 使用文件
  • 使用序列化与反序列化
  • 使用数据库

使用文件

将所需保存的对象内容或者数据内容以文件的形式进行存储,在使用时直接读取文件并且解析。

优点

几乎能够保存任何形式的数据;实现简单。

缺点

读写文件的效率比较低,不适用于数据量比较大的情况。

应用场景

读写速率要求不高、数据量不大且数据格式没有严格限定的情况。

推荐使用形式

将对象转换为json字符串进行存取,java有json格式数据的解析函数,十分方便。

使用序列化与反序列化

在不使用数据库的情况下,比较方便的保存和加载少量的数据。数据以XXX.ser文件保存。注意:XXX.ser 文件所在的路径必须已经存在,否则会出现“找不到”或者“不存在”问题。XXX.ser 文件能够自动生成。

优点

能够保存所有对象数据,并且对私有数据可控;实现简单;读写数据结构严谨,解析方便。

缺点

不适用于数据量比较大的情况。

应用场景

读写速率要求不高、数据量不大的情况。

使用数据库

根据数据具体类型,选择合适的关系型或者非关系型数据库。

优点

适用于数据量比较大的情况;读写速度快;数据结构严谨。

缺点

只能保存数据库接受的数据;比前两者实现稍显复杂。

应用场景

读写速率要求高、数据量大且数据结构严谨的情况。

推荐数据库

如果选用关系型数据库,数据量低于50GB的小型数据库应用, 推荐使用JDK自带的Apache Derby的内嵌开发模式。Derby非常小 巧,核心部分derby.jar只有2M,相比于使用其他数据库使用起来 十分简便。