Java序列化 如何把多个对象存储在一个文件中
/**
* 用于保存模板文件,内容包括:
* 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序列化 如何把多个对象存储在一个文件中的更多相关文章
- Java基础之序列化对象——将对象写入到文件中(SerializeObjects)
控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...
- python将一些朋友的姓名存储在一个列表中,访问该列表中的每个元素,从而将每个朋友的姓名都打印出来
""" 3-1 姓名: 将一些朋友的姓名存储在一个列表中,并将其命名为 names . 依次访问该列表中的每个元素,从而将每个朋友的姓名都打印出来. "&quo ...
- java对象序列化并存储到文件中
● 如何将一个Java对象序列化到文件里 使用输入输出流,,一个是ObjectOutputStream 对象,ObjectOutputStream 负责向指定的流中写入序列化的对象.当从文件中读取序列 ...
- 22.Java面试学习平台-整合OSS对象存储
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- 每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)
一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象.所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象.一个应用是,程序在执行过程中突 ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...
- 《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合
讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...
随机推荐
- (转载)Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)
在上篇文章中,我给大家介绍了如何在cocos2d-x里面绘制一个三角形,当时我们使用的是cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时, ...
- 【BZOJ 1013】 [JSOI2008]球形空间产生器sphere
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
- Controlling Site Provisioning Process with a Custom Provider
http://www.cnblogs.com/frankzye/archive/2010/09/07/1820346.html http://sujoysharepoint2010.blogspot. ...
- 元素属性和js数组
arrObj.push(数组元素) --增加arrObj.splice(index,howmany)--删除 一般howmany为1, index,开始截取掉的位置,arrObj[index].P ...
- Linux:crontab命令学习
一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...
- PAT-乙级-1029. 旧键盘(20)
1029. 旧键盘(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 旧键盘上坏了几个键,于是在敲一段文字的 ...
- [js综合问题汇总]js窗口关闭事件,表单名称,父窗口子窗口,var变量名
<script type="text/javascript"> window.onbeforeunload = onbeforeunload_handler; //wi ...
- jquery图片放大器插件
将鼠标移动到一张图片上来的时候,放大该图片的某些细节. <html> <head> <script src="../js/jquery-1.6.js" ...
- 几款开源的图形界面库(GUI Libraries)
SmartWin++ 遵循BSD许可协议的C++ GUI库,建立在Windows API之上,但仍可以通过使用WineLib在Linux/xNix上使用.也支持Pocket PC和基于Windows ...
- linux mysql添加用户
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码" 例1.增加一个用户user_1密码为123,让他可以在任何主机上登录 ...