java序列化对象后读取数据错误的问题

今天学到了对象的序列化,就是将对象写入到文件中去,大家要直到我们普通的输入输出文件只是把数据的值写入了文件,而没有把数据的类型与之绑定,比如我向文件中写入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());

输出如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值