1.自定义类实现serializable接口
package day20;
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;
public class TestIO {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub//
Student s1 = new Student("zhang3",12);
Student s2 = new Student("li4",15);
Student s3 = new Student("zhao6",20);
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
//把对象写入文件
FileOutputStream fos = new FileOutputStream("Student.txt");
ObjectOutputStream out = new ObjectOutputStream(fos);
//把list写入文件
out.writeObject(list);
out.close();
//从文件中读取对象
FileInputStream fis = new FileInputStream("Student.txt");
ObjectInputStream in = new ObjectInputStream(fis);
List<Student> list1 = new ArrayList<Student>();
try {
//把读到的内容放在一个list中
list1 = (ArrayList<Student>)in.readObject();
System.out.println(list1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
in.close();
}
}
class Student implements Serializable{
private static final long serialVersionUID = 42L;
String name;
// transient int age; //transient 修饰属性时 该属性为临时属性 不参与对象序列化
int age;
public Student() {
System.out.println("haha");
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name: " + name + "\t" + "age: " + age;
}
}
2.自定义类实现Externalizable接口
使用ObjectOutputStream 把list写入文件中
使用ObjectInputStream 从文件中读取文件
package day20;
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
//自定义序列化
public class TestList {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//创建两个对象
Animal t1 = new Animal("zhang3",13,"男");
Animal t2 = new Animal("li4",20,"女");
//把对象写入list中 并指定list的泛型
List<Animal> list = new ArrayList<Animal>();
list.add(t1);
list.add(t2);
//文件输出流
FileOutputStream fos = new FileOutputStream("Animal.dat");
//过滤流
ObjectOutputStream out = new ObjectOutputStream(fos);
//把list写入文件中
out.writeObject(list);
//关闭流
out.close();
//文件输入流
FileInputStream fis = new FileInputStream("Animal.dat");
//过滤流
ObjectInputStream in = new ObjectInputStream(fis);
//创建一个list1用于接收从文件中读取的list对象
List<Animal> list1 = new ArrayList<Animal>();
try {
//读取list readObject读取出来的是Object类型 需要强转为ArrayList<Student>类型
list1 = (ArrayList<Animal>)in.readObject();
System.out.println(list1.get(0));
} catch (Exception e) {
}
in.close();
}
}
class Animal implements Externalizable{ //实现Externalizable接口 里面有两个方法需要实现
String name;
int age;
String sex;
public Animal() {}
public Animal(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Animal [name=" + name + ", age=" + age + "]";
}
//往文件中写数据 传入out流 这个流不需要close 实现对象的序列化
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// TODO Auto-generated method stub
out.writeUTF(name);//把name属性写进文件
out.writeInt(age);//把name属性写进文件
out.writeUTF(sex);//把name属性写进文件
}
//从文件中读取数据 实现对象的反序列化
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
name = in.readUTF();
age = in.readInt();
sex = in.readUTF();
}
}