今天学到了对象的序列化,就是将对象写入到文件中去,大家要直到我们普通的输入输出文件只是把数据的值写入了文件,而没有把数据的类型与之绑定,比如我向文件中写入100,那么这是字符串”100“还是整数100还是高精度浮点数呢,我们是不能确定的,将数据的类型和值一起写入文件中,这就是序列化,把序列化的数据从文件中读出来,这就是反序列化
问题
学习过程中我试了试向文件中写和读,可是在读的时候却抛出了异常,测试代码如下
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa.dat"));
oos.writeObject(new Dog());
oos.writeChar('a');
oos.writeUTF("这是一个测试语句");
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa.dat"));
System.out.println(ois.readObject());
System.out.println(ois.readChar());
System.out.println(ois.readUTF());
我是严格按照写进去的顺序来读的,还是提示我异常如下
告诉我读不到目标数据,我就纳闷了,明明正常进去了怎么就读不出来呢,我去看目标文件里面也有我写入的数据啊怎么就读不到呢,试了半天找了半天bug才发现,我在写入文件之后没有关闭输入流,那么我想要写入的数据就还没有真正的进入文件
因为数据在写入时为了提高效率,通常都是把数据先放入缓冲区,等着调用输入流的close或者flush方法的时候会将缓冲区的数据真正送入文件。当然,如果忘了调用这些方法的话,一般在程序结束时系统会将数据真正写入文件中去
这就合理解释了这个问题:在写入命令执行完并且没有关闭输出流的时候数据还留在缓冲区中,并没有真的进入文件,此时我调用读命令读取数据系统则会发现文件是空的,自然就会抛出异常了。
像下面这样加上close方法后就可以正常输出了
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa.dat"));
oos.writeObject(new Dog());
oos.writeChar('a');
oos.writeUTF("这是一个测试语句");
oos.close();//关闭输出流
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa.dat"));
System.out.println(ois.readObject());
System.out.println(ois.readChar());
System.out.println(ois.readUTF());
输出如下