java中的序列化与反序列化
序列化就是将一个对象以及他的属性写入一个文件,保存在存中对象的状态
反序列化就是把保存的对象状态再读出来
实现序列化与反序列化就要使用到IO操作中文件的字节流输入与输出
inputStream与outputStream对字节流操作inputStreamReader与outputStreamWrite为字符流操作
input与output是对于java内存而言的 input输入是由外部----->内存 output输出是内存---->外部
任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象,我们可以用read()方法将其取出
任何有能力接收数据源(流)的javaio对象我们就可以看作是一个OutputStream对象,可以用write()方法接受
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的,Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
字节流与字符流:http://blog.csdn.net/zxman660/article/details/7875799序列化分三步
1.创建FileOutputStream 对象,file是一个File类的对象
File file = new File("D:\\person.per");括号内表示生成文件的存储路径
FileOutputStream fout = new FileOutputStream(file);
2.创建ObjectOutputStream 对象
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(fout);
3.将对象写入
p是一个实例化的对象Person p = new Person("aaa",12);
oos.writeObject(p);
最后就得关闭输出流,节省资源
oos.close();
fout.close();
反序列化也分三步,与序列化对应
1.
1.新建FileInputStream 对象,读取文件
FileInputStream fin = new FileInputStream(file);
2.新建ObjectInputStream 对象
ObjectInputStream oin;
oin = new ObjectInputStream(fin);
3.读取文件并恢复为对象
Person per1 = (Person) oin.readObject();
fin.close();
oin.close();
public class Javaxuliehua { public static void main(String[] args) { //File file = new File("D:"+File.separator+"person.per"); File file = new File("D:\\person.per"); /** * 序列化过程 */ Person p = new Person("aaa",12); try { FileOutputStream fout = new FileOutputStream(file); ObjectOutputStream oos = null; oos = new ObjectOutputStream(fout); oos.writeObject(p); oos.close(); fout.close(); /** * 反序列化过程 */ FileInputStream fin = new FileInputStream(file); ObjectInputStream oin; oin = new ObjectInputStream(fin); Person per1 = (Person) oin.readObject(); System.out.println(per1); fin.close(); oin.close(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } } class Person implements Serializable{ 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 + "]"; } }