/**
 * 用于保存模板文件,内容包括:
 * 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. jQuery 点击按钮刷新页面

    //页面加载时绑定按钮点击事件 $(function () { $("#按钮id").click(function () { refresh(); }); }); //点击按钮调用 ...

  2. owa Your request can't be completed right now. Please try again later.

    Your request can't be completed right now. Please try again later.

  3. python总字符串

    前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" "括起来表示 ...

  4. python学习笔记25(文件管理 os包)

    os包我们经常会与文件和目录打交道,对于这些操作python提供了一个os模块,里面包含了很多操作文件和目录的函数.如果你对linux基本操作了解的话,下面的一些os方法应该会很熟悉的,因为基本和li ...

  5. 在树莓派上 搭建sqlite数据库

    最近找工作需要学习一些数据库方面的知识,所以就在实验室的树莓派上准备装个数据库试试,刚开始准备装一个mysql数据库,出现了很多问题,放弃了,后来查了一些资料原来还有很多可以用的小巧实用的数据库,sq ...

  6. C#和Js 编码和解码方法

    Server.UrlDecode(); Server.UrlEncode(); Server.HtmlDecode(); Server.HtmlEncode();

  7. 去除C/C++程序代码中的注释

    最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...

  8. GIS的数学基础

    在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...

  9. python 中的列表解析和生成表达式 - 转

    优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(  List comprehensions)和生成表达式,通过这两 ...

  10. no appropriate service handler found The Connection descriptor used by the client was: localhost:1521:myorcl

    参考网址:http://www.2cto.com/database/201205/133542.html http://www.cnblogs.com/kerrycode/p/4244493.html ...