对象的保存和载入

2024-05-30 19:32
文章标签 保存 对象 载入

本文主要是介绍对象的保存和载入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

static       http://t240178168.iteye.com/blog/1667275

1.第一种方法:采用手动的方法

手动的将对象的各个字段写入到文件中,读取时再通过特定的标识符从文件中获取各个属性的值,生成对象。可以手工编辑文件

缺点:缺乏灵活性,代码量大

实现:略

2.第二种方法:采用Java的序列化机制

实现简洁,代码量小,生成的文件都是二进制的

缺点:文件不可编辑

实现:略

3.第三种方法:以XML文件的形式保存和读取(方法很多,以下使用两种方式简单实现)

①采用 java.beans.XMLEncoder 或者 java.beans.XMLDecoder

首先建立  Contact.java  (JavaBean)

import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;/**
 * @Author:胡家威  
 * @CreateTime:2011-9-27 下午09:28:57
 * @Description:联系人的类
 */@XmlRootElement //注意注解,XML的根元素
public class Contact implements Serializable {private static final long serialVersionUID = 4445549905840681824L;private long id;private String name;private String email;public Contact() {}public Contact(long id){this.id = id;}//每个getter方法上面都有一个注解,表明它是一个XML的元素@XmlElementpublic long getId(){return id;}@XmlElementpublic String getName() {return name;}@XmlElementpublic String getEmail() {return email;}public void setName(String name) {this.name = name;}public void setEmail(String email) {this.email = email;}public void setId(long id) {this.id = id;}}

 

建立测试的类:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;/**
 * @Author:胡家威  
 * @CreateTime:2011-9-27 下午09:27:55
 * @Description:JAXB的简单使用实例
 */public class JaxbTest {private Marshaller marshaller;private Unmarshaller unmarshaller;private String filename;public JaxbTest() {try {JAXBContext context = JAXBContext.newInstance(Contact.class);marshaller = context.createMarshaller();unmarshaller = context.createUnmarshaller();        filename="contact.xml";} catch (Exception e) {e.printStackTrace();}}// 创建一个新的联系人public void creatContact(Contact contact) {FileWriter fw = null;try {fw = new FileWriter(filename);marshaller.marshal(contact, fw);} catch (Exception e) {e.printStackTrace();} finally{try {fw.close();} catch (IOException e) {e.printStackTrace();}}}// 读取一个联系人public Contact readContact() {FileReader fr = null;Contact contact = null;try {fr = new FileReader(new File(filename));contact = (Contact)unmarshaller.unmarshal(fr);} catch (Exception e) {e.printStackTrace();} finally{try {fr.close();} catch (IOException e) {e.printStackTrace();}}return contact;}public static void main(String[] args) {JaxbTest test = new JaxbTest();Contact contact = new Contact();contact.setId(1);contact.setName("name");contact.setEmail("email");test.creatContact(contact);System.out.println("---");Contact contact2 = test.readContact();if(contact2!=null){System.out.println(contact2.getId());System.out.println(contact2.getName());System.out.println(contact2.getEmail());}}}

 

生成的xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact><email>email</email><id>1</id><name>name</name>
</contact>

 

②采用JAXB

Javabean使用上面的Contact类

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;/**
 * @Author:胡家威  
 * @CreateTime:2011-9-27 下午10:20:20
 * @Description:XMLEncoder和XMLDecoder的使用实例
 */public class XMLEDncoder {private static String filename = "javabean.txt";public static void main(String[] args) {Contact contact = new Contact();contact.setId(1);contact.setName("name");contact.setEmail("email");writeJavaBean(contact);System.out.println("---");Contact contact2 = (Contact)readJavaBean();if(contact2!=null){System.out.println(contact2.getId());System.out.println(contact2.getName());System.out.println(contact2.getEmail());}}/**
     * 向文件中写入对象
     */public static void writeJavaBean(Object javabean) {if(javabean==null){return;}try {OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(filename)));XMLEncoder encoder = new XMLEncoder(out);encoder.writeObject(javabean);encoder.close();out.close();} catch (Exception e) {e.printStackTrace();}}/**
     * 从文件中读取对象
     */public static Object readJavaBean() {try {InputStream in = new BufferedInputStream(new FileInputStream(new File(filename)));XMLDecoder decoder = new XMLDecoder(in);Object object = decoder.readObject();in.close();decoder.close();return object;} catch (Exception e) {e.printStackTrace();return null;}}}

 

生成的txt文件:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_21" class="java.beans.XMLDecoder"> <object class="Contact"> <void property="email"> <string>email</string> </void> <void property="id"> <long>1</long> </void> <void property="name"> <string>name</string> </void> </object> 
</java> 
分类: JavaSE学习


static

  • 博客分类: 
  • java
static
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),例如: 
未声明为static 
class ClassA{ 
int b; 
public void ex1(){ 
… 


class ClassB{ 
void ex2{ 
int i; 
ClassA a = new ClassA(); 
i = a.b; //这里通过对象引用访问成员变量b 
a.ex1; //这里通过对象引用访问成员函数ex1 



声明为static 
class ClassA{ 
static int b; 
static void ex1(){ 
… 


class ClassB{ 
void ex2{ 
int i; 
i = ClassA.b; //这里通过类名访问成员变量b 
ClassA.ex1; //这里通过类名访问成员函数ex1 


通过以上两种比较,就可以知道static用来修饰类成员的主要作用了 

,在java类库当中有很多类成员都声明为static,可以让用户不需要 
实例化对象就可以引用成员,最基本的有Integer.parseInt(),Float.pa 
rseFloat()等等用来把对象转换为所需要的基本数据类型。这样的变量和 
方法我们又叫做类变量和类方法。 
接下来讲一下被static修饰后的变量的值的问题,刚才在前面讲过,被s 

tatic修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行 
才会释放,那么就是说该类的所有对象都会共享这块内存空间,看一下下面 
这个例子: 
class TStatic{ 
static int i; 

public TStatic(){ 
i = 4; 


public TStatic(int j){ 
i = j; 


public static void main(String args[]){ 
TStatic t = new TStatic(5); //声明对象引用,并实例化 
TStatic tt = new TStatic(); //同上 
System.out.println(t.i); 
System.out.println(tt.i); 
System.out.println(t.i); 


,第一个用于初始化I为4,第二个用于初始化i为传进函数的值, 
在main中所传的值是5,程序首先声明对象的引用t,然后调用带参 
数的构造函数实例化对象,此时对象t的成员变量I的值为5,接着 
声明对象tt,调用无参数的构造函数,那么就把对象tt的成员变量 
i的值初始化为4了,注意了,在这里i是static,那就是说该类 
所有对象都共享该内存,那也就是说在实例化对象tt的时候改变了 
i的值,那么实际上对象t的i值也变了,因为实际上他们引用的 
同一个成员变量。最后打印的结果是三个4。呵呵,写到这里大家 
是否明白了呢?不明白就再看看书或者多写几个例子印证一下, 
呵。 


是这样的,static定义的变量是个所有该类对象共有的变量,那 


么我们可以举个例子来说明,比如,我编写一个Student类,该类中有个 
static变量count用来记录学生的个数,在构造方法中做count++。那么当 
我每创建一个对象时count都会做自加,也就是每创建一个Student的对象系统 
就会记录一个,那么很显然,我就可以调用这个count知道一共有多少Student对象 
了。这个是个很简单的例子,不过应该可以说明问题了。 
问题:雇员类有个雇员基本工资,对于员工A员工B都是一样的,但是管理员又有可能需要对这个工资做调整,也就是不能定义成常量.像这样的变量你要怎么处理呢?怎么保证这样的一致性? 
于是static成员变量和成员方法就产生咯: 
static int salary; 
public static void setSalary(int salary){this.salary = salary;} 
public static int getSalary(){return salary;} 
这样的话我就直接用员工类.方法得到统一的基本工资值啦: 
Employee.setSalary(800); 
Employee.getSalary(); 
至于每个员工嘛,也可以调用这个方法查看自己的基本工资 
Employee A = new Employee(); 
A.getSalary();

这篇关于对象的保存和载入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016774

相关文章

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla