Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

本人小白一个,不能保证博客中内容都准确,如果博客中有错误的地方,望各位多多指教,请指正。

上面的内容仅仅能解决本人遇到的 错误,不一定适用于所有人,如有不适用,请多多包涵。

 

java.io.StreamCorruptedException :

               API中的解释:当从对象流读取的控制信息违反内部一致性检查时抛出。

 

第一个StreamCorruptedException错误  :

               Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 64646464

               Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

               问题描述:直接反序列化非空且未序列化的文件

              Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

             产生的原因:未遵循   先序列化,再反序列化  原则 

             解决办法:遵循   先序列化,再反序列化  原则 

  Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

第二个StreamCorruptedException错误  :

               Exception in thread "main" java.io.StreamCorruptedException: invalid type code: AC

                            Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

               问题描述:序列化多次写入时,从后面追加内容,不覆盖文件中的内容,全部写入之后,然后再读取,之前的数据可以读出来,新增的数据读取不出来,然后报这个错

Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

               产生的原因:

                       下图中源码显示:

                                写文件时: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

以上都仅是我个人理解,如有错误请指正

Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

               解决办法:

                       办法一:就是因为每次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。

以上都仅是我个人理解,如有错误请指正

                 Exception in thread “main“ java.io.StreamCorruptedException 当从对象流读取的控制信息违反内部一致性检查时抛出

                       办法二:写入对象之前,先将文件中对象读取出来存入list集合,然后再覆盖文件内容写入,先将list

集合内的对象写入,再写入你要写入的对象

                       办法三:用一个count计数器记录你每次new OOS写入对象写入了几个对象,new多少个OOS就应该有多少个count计数器,在你读的时候就应该new 多少个OIS,在new一次OIS之后 ,每读count个对象之后,就new一次OIS,再读count个对象,再new OIS....

以上都仅是我个人理解,如有错误请指正