java.io.StreamCorruptedException: invalid type code: AC错误的解决方法

问题描述:

在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流对象,在向外读数据的时候第一次运行的时候不会报错,在第二次就会报java.io.StreamCorruptedException: invalid type code: AC错误。

原因:

在一个文件都有一个文件的头部和文件体。由于对多次使用FileOutputStream(文件名,true)构建的ObjectOutputStream对象向同一个文件写数据,在每次些数据的时候他都会向这个文件末尾先写入header在写入你要写的对象数据,在读取的时候遇到这个在文件体中的header就会报错。导致读出时,出现streamcorrput异常(流中的控制信息不一致)。 只有续写会先写入header,不是续写的话,写入多个对象也只会写入一次文件头,在一次续写时即使写入多个对象,也只会写入一次文件头

知识储备: 每个文件都有文件的头部和文件体两部分 在对象输出流(ObjectOutputStream)中有Protected方法writeStreamHeader():void,这个方法是专门来写文件的头部了。

解决办法:所以这里要判断是不是第一次写文件,若是则写入头部,否则不写入。

代码示例:

import java.io.*
public class MyObjectOutputStream extends ObjectOutputStream{
    public MyFileOutputStream(){
        super();
    }
    public MyFileOutputStream(OutputStream o){
        super(o);
}
    public void writeStreamHeader(){}//这里覆写父类中的方法,使他调用writeObject()的时候不写入文件头
}

class Demo{
    public static void main(String[] args){
        File file=new File(xxxxxxx);
        ObjectOutputStream out;
        //判断文件是否存在,以决定要使用哪个objectoutputstream
        if(file.isFile()){
        out=new MyObjectOutputStream(xxxx);
}
            else{
                out=new ObjectOutputStream(xxxxx);
}
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LhWorld哥陪你聊算法

【Spark篇】---Spark中Shuffle机制,SparkShuffle和SortShuffle

Spark中Shuffle的机制可以分为HashShuffle,SortShuffle。

24630
来自专栏编程思想之路

WiFiAp探究实录--功能实现与源码分析

Android虐我千百遍,我待Android如初恋。 ——————编辑于2017-08-02——————— wifi热点说的是wifiAp相...

1.7K90
来自专栏LanceToBigData

Hadoop(十四)MapReduce原理分析

前言   上一篇我们分析了一个MapReduce在执行中的一些细节问题,这一篇分享的是MapReduce并行处理的基本过程和原理。   Mapreduce是一个...

83080
来自专栏酷玩时刻

PC 微信扫码登陆

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。进一步了解OAuth2.0-----理解OAuth2.0 官方介绍资料

1.9K40
来自专栏Spark学习技巧

用java提交一个Spark应用程序

第一种方式 经常有人在公众号留言或者在群里问浪尖,如何使用java代码提交一个Spark应用程序。在这里浪尖介绍一种简单的方法来实现这个功能。 首先用vim打开...

426100
来自专栏漏斗社区

歪?我想要一个XXE。

0x00 背景 近期看到OWASP TOP 10 2017 版中添加了XXE的内容便对XXE的一些知识进行梳理和总结,XXE可以使用例如http,file等协...

41590
来自专栏racaljk

Erlang Concurrent 并发进阶

使用Erlang而不是其他函数式编程语言的主要原因之一就是Erlang的并发处理能力和分布式编程。并发意味着程序可以在同一时刻执行多个线程。举个例子,操作系统允...

16440
来自专栏Hadoop实操

如何在非安全的CDH集群中部署Jupyter并集成Spark2

Jupyter Notebook是一个Web应用程序,允许你创建和分享,包含实时的代码,可视化和解释性文字。常用于数据的清洗和转换、数值模拟、统计建模、机器学习...

52120
来自专栏祝威廉

Spark Streaming Crash 如何保证Exactly Once Semantics

其实这次写Spark Streaming相关的内容,主要是解决在其使用过程中大家真正关心的一些问题。我觉得应该有两块:

16510
来自专栏一名合格java开发的自我修养

RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

  序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果。服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用。...

16620

扫码关注云+社区

领取腾讯云代金券