读java对象头代码 对象 java

java从文件读取对象可以使用 ObjectOutputStream 将对象写入文件中,使用 ObjectInputStream 类从文件中读取出对象 。
代码如下:
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
class Person implements Serializable {
private static final long serialVersionUID = -3527230407404080537L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class App34 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ListPerson persons = new ArrayList();
persons.add(new Person("张三", 20));
persons.add(new Person("李四", 25));
File file = new File("persons.data");
// 创建文件输出流
FileOutputStream output = new FileOutputStream(file);
// 创建对象输出流
ObjectOutputStream oOutput = new ObjectOutputStream(output);
// 将整个数组列表输出至文件
oOutput.writeObject(persons);
// 或者逐个将对象输出至文件,读取时需要逐个读取
/*for (Person p : persons) {
oOutput.writeObject(p);
}*/
oOutput.close();
output.close();
// 创建文件输入流
FileInputStream input = new FileInputStream(file);
// 创建对象输入流
ObjectInputStream oInput = new ObjectInputStream(input);
// 读出整个对象列表
ListPerson persons2 = (ListPerson) oInput.readObject();
for (Person p : persons2) {
System.out.println(p);
}
// 或者逐个读取对象
/*Person p1 = null;
try {
while((p1 = (Person) oInput.readObject()) != null) {
System.out.println(p1);
}
} catch (EOFException e) {
System.out.println("读取对象结束");
}*/
oInput.close();
input.close();
}
}
java如何从文件中读取对象并用set保存java中从文件中读取对象,主要是使用ObjectInputStream读java对象头代码的readObject方法来读取对象 , 如下代码读java对象头代码:
public static Object readObjectFromFile()
{
Object temp=null;
File file =new File("test.dat");
FileInputStream in;
try {
in = new FileInputStream(file);
ObjectInputStream objIn=new ObjectInputStream(in);
temp=objIn.readObject();//从文件当中读取对象
SetObject duixiang = new HashSetObject();
duixiang.add(temp);//添加对象到set集合里面
objIn.close();
System.out.println("read object success!");
} catch (IOException e) {
System.out.println("read object failed");
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return temp;
}
JVM对象头(header)HotSpot 虚拟机的对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)
1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等 。JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64bit ,  在 64-bit JVM 上占用 128bit 即 16 bytes(暂不考虑开启压缩指针的场景) 。

推荐阅读