Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出
本人小白一个,不能保证博客中内容都准确,如果博客中有错误的地方,望各位多多指教,请指正。
上面的内容仅仅能解决本人遇到的 错误,不一定适用于所有人,如有不适用,请多多包涵。
java.io.StreamCorruptedException :
API中的解释:当从对象流读取的控制信息违反内部一致性检查时抛出。
第一个StreamCorruptedException错误 :
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 64646464
问题描述:直接反序列化非空且未序列化的文件
产生的原因:未遵循 先序列化,再反序列化 原则
解决办法:遵循 先序列化,再反序列化 原则
第二个StreamCorruptedException错误 :
Exception in thread "main" java.io.StreamCorruptedException: invalid type code: AC
问题描述:序列化多次写入时,从后面追加内容,不覆盖文件中的内容,全部写入之后,然后再读取,之前的数据可以读出来,新增的数据读取不出来,然后报这个错
产生的原因:
下图中源码显示:
写文件时:new一个OOS时会写入一个short类型的magic和一个short类型的version,而调用writeObject方法写入的是byte类型的tc,所以如果不覆盖文件内容写入的话,文件中的数据就成变为一个short类型的magic和一个short类型的version + byte类型的tc+byte类型的tc+short类型的magic + byte类型的tc+byte类型的tc+short类型的magic + byte类型的tc+byte类型的tc...
而读文件的时候new一个OIS会先读取一个short类型的magic和一个short类型的version,然后调用readObject方法,读取的是byte类型的tc,所以如果不覆盖文件内容写入的话,向文件中读取数据就会变为一个short类型的magic和一个short类型的version+byte类型的tc+byte类型的tc+byte类型的tc...
所以两个一结合,第二次new OOS不覆盖文件内容写入后,此时文件中就有两个short类型的magic和short类型的version,而不管怎么new OIS读取,都是从头开始读,怎么样都只能读一个hort类型的magic和short类型的version,而文件中还有一个hort类型的magic和short类型的version,所以,当读到第二个hort类型的magic和short类型的version时
(以上都仅是我个人理解,如有错误请指正)
解决办法:
办法一:就是因为每次new OOS的时候会写入一个short类型的magic和一个short类型的version,而每次new OIS读的时候,都是从头开始读,只能读一个short类型的magic和一个short类型的version,才导致会报错,所以解决办法就是,只让第一次new OOS的时候写入一个short类型的magic和一个short类型的version,而后面不论new多少个OOS都不让它写入short类型的magic和short类型的version。怎么实现呢?
自定义一个类MyOOS,继承OOS,然后覆盖掉 writeStreamHeader方法,不让其写入一个short类型的magic和一个short类型的version,直接在方法内调用OOS的reset方法,然后在创建对象时,先判断文件是否存在,文件长度是否为0,如果文件不存在或者文件长度为0,说明是第一次new OOS,所以写入header(一个short类型的magic和一个short类型的version),所以就直接new OOS,反之,说明不是第一次new OOS,所以不写入header(一个short类型的magic和一个short类型的version),所以就直接new MyOOS。
(以上都仅是我个人理解,如有错误请指正)
办法二:写入对象之前,先将文件中对象读取出来存入list集合,然后再覆盖文件内容写入,先将list
集合内的对象写入,再写入你要写入的对象
办法三:用一个count计数器记录你每次new OOS写入对象写入了几个对象,new多少个OOS就应该有多少个count计数器,在你读的时候就应该new 多少个OIS,在new一次OIS之后 ,每读count个对象之后,就new一次OIS,再读count个对象,再new OIS....
(以上都仅是我个人理解,如有错误请指正)