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的元素
@XmlElement
public long getId(){
return id;
}
@XmlElement
public String getName() {
return name;
}
@XmlElement
public 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学习
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?
在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();
在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();