/**
 * 用于保存模板文件,内容包括:
 * 1,标志位,1 int
 * 2,版本   1 int
 * 3,数据头长度 1 int
 * 4,预留数据头空间  5120 byte
 * 5,后续数据长度  0不存在,>0存在
 * 7,后续数据
 * @author benson
 *
 */
import java.io.*;

public class BTemplateFile {
    private static final int FLAG = -1;
    private static final int HEAD_LENGTH = 5120;
    private byte[] head = null;
    private static BTemplateFile instance;
    
    //单例模式
    public static synchronized BTemplateFile getInstance(){
        if (instance == null) {
          instance = new BTemplateFile();
        }
        return instance;
      }

/**
     * 构造函数
     */
    private BTemplateFile() {
        super();
        // TODO Auto-generated constructor stub
        head = new byte[HEAD_LENGTH];
        for (int i = 0; i < HEAD_LENGTH; i++) {
            head[i] = (byte) 0xff;
        }
    }

/**
     * 创建一个空白的模板文件
     * 
     * @param version
     * @param filename
     * @throws IOException
     */
    public void create(File file) throws IOException {
        if (!file.exists()) {
            FileOutputStream _out = new FileOutputStream(file);

DataOutputStream _data_out = new DataOutputStream(_out);
            _data_out.writeInt(FLAG); // 写入标志
            _data_out.writeInt(0); // 写入版本
            _data_out.writeInt(0); // head_length
            _data_out.write(head);
            _data_out.writeInt(0); // 无后续数据
            _data_out.write(head); // 填充2000个字节的空数据
            _data_out.close();
            _out.close();
        }
    }

/**
     * 读取head
     * 
     * @param filename
     * @return
     * @throws Exception
     */
    public Object read_head(File file) throws Exception {
        if(!file.exists()){
            throw new Exception("读取模板文件不存在!");
        }
        Object obj = null;
        DataInputStream _in = new DataInputStream(new FileInputStream(file));
        int flag = _in.readInt();
        int version = _in.readInt();
        if (flag != FLAG) {
            _in.close();
            throw new Exception("文件格式错误!");
        }

if (version == 0) {
            int head_length = _in.readInt();
            if (head_length > 0) {
                ObjectInputStream _obj_in = new ObjectInputStream(_in);
                obj = _obj_in.readObject();
            }
        }
        _in.close();
        return obj;
    }

/**
     * 读取数据对象
     * 
     * @param filename
     * @return
     * @throws Exception
     */
    public Object read_data(File file) throws Exception {
        if(!file.exists()){
            throw new Exception("读取模板文件不存在!");
        }
        Object obj = null;
        DataInputStream _in = new DataInputStream(new FileInputStream(file));
        int flag = _in.readInt();
        int version = _in.readInt();

if (flag != FLAG) {
            _in.close();
            throw new Exception("文件格式错误!");
        }
        if (version == 0) {
            int head_length = _in.readInt();
            _in.read(head);
            int data_length = _in.readInt();

if (data_length > 0) {
                ObjectInputStream _obj_in = new ObjectInputStream(_in);
                obj = _obj_in.readObject();
            }
        }
        _in.close();
        return obj;
    }

/**
     * 修改头信息
     * 
     * @param head_str
     * @throws Exception
     */
    public void modify_head(Object head_obj,File file) throws Exception {
        if(!file.exists()){
            throw new Exception("读取模板文件不存在!");
        }
        RandomAccessFile rfile = new RandomAccessFile(file, "rw");
        int flag = rfile.readInt();
        int version = rfile.readInt();
        if (flag != FLAG) {
            rfile.close();
            throw new Exception("文件格式错误!");
        }
        if (version == 0) {
            ByteArrayOutputStream _out = new ByteArrayOutputStream();
            ObjectOutputStream _obj_out = new ObjectOutputStream(_out);
            _obj_out.writeObject(head_obj);
            _obj_out.flush();
            byte[] head_bytes = _out.toByteArray();
            if (head_bytes.length < HEAD_LENGTH) {
                rfile.writeInt(head_bytes.length);
                rfile.write(head_bytes);
            } else {
                rfile.close();
                throw new Exception("头长度超过限制(" + HEAD_LENGTH + ")="
                        + head_bytes.length);
            }
        }
        rfile.close();
    }

/**
     * 修改数据对象
     * 
     * @param data
     * @param filename
     * @throws Exception
     */
    public void modify_data(Object data, File file) throws Exception {
        if(!file.exists()){
            throw new Exception("读取模板文件不存在!");
        }
        RandomAccessFile rfile = new RandomAccessFile(file, "rw");
        int flag = rfile.readInt();
        int version = rfile.readInt();
        if (flag != FLAG) {
            rfile.close();
            throw new Exception("文件格式错误!");
        }
        if (version == 0) {
            int head_length = rfile.readInt();
            rfile.skipBytes(HEAD_LENGTH);
            ByteArrayOutputStream _out = new ByteArrayOutputStream();
            ObjectOutputStream _obj_out = new ObjectOutputStream(_out);
            _obj_out.writeObject(data);
            _obj_out.flush();
            byte[] data_bytes = _out.toByteArray();
            rfile.writeInt(data_bytes.length);
            rfile.write(data_bytes);
            _obj_out.close();
            _out.close();
        }
        rfile.close();
    }

/**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        BTemplateFile b = new BTemplateFile();
        String filename = "d:\\tmp\\1\\aa.vav";
        File file=new File(filename);
        ClientData data = new ClientData();
        data.setKey(100);
        data.setValue("111111111111111111111111");
        data.setSaveName("中国人民共和国");

ClientData data1 = new ClientData();
        data1.setKey(3333333);
        data1.setValue("33333333333333");
        data1.setSaveName("到搜房数据发生");

b.create(file);

b.modify_head(data1, file);
        System.out.println("1 ------");

b.modify_data(data, file);
        System.out.println("2 ------");

ClientData head = (ClientData) b.read_head(file);
        if (head != null)
            System.out.println("head:" + head.getKey() + " " + head.getValue()
                    + " " + head.getSaveName());
        else
            System.out.println("head is null");

ClientData c = (ClientData) b.read_data(file);
        if (c != null)
            System.out.println("data:" + c.getKey() + " " + c.getValue() + " "
                    + c.getSaveName());
        else
            System.out.println("data is null");
    }

}

Java序列化 如何把多个对象存储在一个文件中的更多相关文章

  1. Java基础之序列化对象——将对象写入到文件中(SerializeObjects)

    控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...

  2. python将一些朋友的姓名存储在一个列表中,访问该列表中的每个元素,从而将每个朋友的姓名都打印出来

    """ 3-1 姓名: 将一些朋友的姓名存储在一个列表中,并将其命名为 names . 依次访问该列表中的每个元素,从而将每个朋友的姓名都打印出来. "&quo ...

  3. java对象序列化并存储到文件中

    ● 如何将一个Java对象序列化到文件里 使用输入输出流,,一个是ObjectOutputStream 对象,ObjectOutputStream 负责向指定的流中写入序列化的对象.当从文件中读取序列 ...

  4. 22.Java面试学习平台-整合OSS对象存储

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  5. 每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)

    一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象.所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象.一个应用是,程序在执行过程中突 ...

  6. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  7. 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的

    0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...

  8. 《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  9. 《Java虚拟机原理图解》 1.2、class文件中的常量池

    了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...

随机推荐

  1. (转载)猫都能学会的Unity3D Shader入门指南(一)

    原文地址 http://onevcat.com/2013/07/shader-tutorial-1/ 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚 ...

  2. [scalability] Find all documents that contain a list of words

    Given a list of millions of documents, how would you find all documents that contain a list of words ...

  3. [转载]MongoDB的$inc修改器

    MongoDB的$inc修改器相当于编程语言中的 “+=”“$inc”只能用于操作数值类型的数据,包括整数.长整数和双精度浮点数,用于其他类型的数据会导致操作失败. >db.users.find ...

  4. DWR

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...

  5. Scala中的Extractor

    Scala中使用unapply方法可以实现三种extractor(另外使用unapplySeq也可以实现extractor) def unapply(object: S): Option[(T1, . ...

  6. 【C++基础】内存操作 getMemory改错

    内存操作的考察点:①指针 ②变量生存期及作用范围 ③动态内存申请和释放 笔试题************************************************************* ...

  7. C#基础精华02(静态类,值类型,引用类型,枚举,结构,ref与out)

    静态类 静态类不能被其他类继承,静态成员亦不能被继承(访问的是同一个),备注1. 静态类只能继承自Object类.(静态类不能继承自其它类.) 继承(多态).静态本身就是相反的. 静态类不能实现任何接 ...

  8. thinkphp框架 中 ajax 的应用

    在thinkphp中,内置了ajax的方法,即: ajaxReturn("data","info","status"); data:传递的数 ...

  9. 比nerdtree更好的文件浏览器:vimfiler

    通过:VimFilerExplorer来打开一个文件浏览器 h:收起 t:展开 -:close 回车:进入或展开 空格:收起

  10. 【HDOJ】1448 The Treasure

    这就是个简单的bfs.真没什么好说的,三维的状态就可以了.每次预处理一下monster的位置,然后再恢复. /* 1924 */ #include <iostream> #include ...