对象的保存和载入

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

相关文章

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化