Java 对象流学习 java核心技术小例子
来源:互联网 发布:淘宝高仿鞋店铺 2016 编辑:程序博客网 时间:2024/05/16 03:18
1,要实现对象流的读写,所有的类要实现Serializable接口,Serializable是一个空接口,没有具体方法,可以提供唯一序列号
2,将对象生成的文件以16进制格式打开,了解下深层次的逻辑,就发现其实对象流也没那么神奇。
例如:开头四位ac ed 00 05 其中ac ed 是固定的头 00 05是 版本号。原理就是将对象中的内容按照设定好的规则编码,然后再解析。
值得注意的是:还原的对象依然保存着地址空间的引用。 如下面的例子读取的新对象 newStaff[0]改变,对应的对她的引用也都会改变。
3,对象的读写可以理解成对内存的记录
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.GregorianCalendar;
public class ObjectStringTest
{
public static void main(String[] args)
{
Employee harry = new Employee("秘书",50000,1989,10,1);
Manager car1 = new Manager("领导car1",80000,1987,12,15);
car1.setSecretary(harry);
Manager tony = new Manager("领导tony",40000,1990,3,15);
tony.setSecretary(harry);
Employee[] staff = new Employee[3];
staff[0] = harry;
staff[1] = car1;
staff[2] = tony;
staff[0].setName("新秘书");
for(Employee e:staff)
{
System.out.println(e);
}
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.dat"));
out.writeObject(staff);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.dat"));
Employee[] newStaff = (Employee[])in.readObject();
in.close();
//newStaff[1].raiseSalary(10); 有新的地址孔家
//重新读取后 由于java的序列化 对象共享同一地址空间
newStaff[0].setName("秘书1");
for(Employee e:newStaff)
{
System.out.println(e);
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//Serializable
class Employee implements Serializable
{
public Employee()
{
}
public Employee(String n,double s,int year ,int month,int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year,month - 1,day);
hireDay = calendar.getTime();
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent/100;
salary += raise;
}
private String name;
private Double salary;//薪水
private Date hireDay;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
@Override
public String toString() {
return "Employee [hireDay=" + hireDay + ", name=" + name + ", salary="
+ salary + "]";
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Date getHireDay() {
return hireDay;
}
public void setHireDay(Date hireDay) {
this.hireDay = hireDay;
}
}
class Manager extends Employee
{
public Manager(String n,double s,int year ,int month,int day)
{
super(n,s,year,month,day);
secretary = null;
}
private Employee secretary;
public Employee getSecretary() {
return secretary;
}
public void setSecretary(Employee secretary) {
this.secretary = secretary;
}
@Override
public String toString() {
return "Manager [secretary=" + secretary + "]";
}
}
0 0
- Java 对象流学习 java核心技术小例子
- java核心技术简单例子
- 学习随笔——Java类和对象小例子
- JAVA高级【8.3】《Java核心技术2》注解-java自定义注解简单小例子
- Java核心技术知识学习
- Java核心技术学习笔记
- JAVA核心技术的学习
- Java核心技术学习笔记
- Java核心技术-学习笔记
- 《java核心技术》学习笔记
- JAVA核心技术学习笔记
- java核心技术学习问题
- java核心技术学习笔记
- java中面向对象 小例子
- Java之Map对象复制小例子
- Java之Map对象复制小例子
- JAVA 对象序列化小例子实现
- java核心技术学习笔记6---对象和类
- VIM 7.4配置和使用
- Bash Shell 里的各种括号
- C#——StreamReader中文编码
- Javascript 无缝滚动
- Combinations --- LeetCode
- Java 对象流学习 java核心技术小例子
- 浅谈桑基图(Sankey diagram):理论、技巧与经典案例分析
- Robolectric Test-Drive Your Android Code
- datatables--阿里巴巴
- Qt for winrt结合Winrt API开发
- positian relative 的理解
- Android系统的架构
- http://blog.csdn.net/feichexia/article/details/7105741#
- N(奇数)阶幻方-java实现代码