您的位置:首页 > 编程语言 > Java开发

java.io.StreamCorruptedException: invalid type code: AC解决办法

2013-09-01 17:23 645 查看
问题描述:

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

原因:

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

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

代码示例:

1.MyObjectOutputStream.java文件

class MyObjectOutputStream extends ObjectOutputStream
{
public MyObjectOutputStream() throws IOException
{
super();
}

public MyObjectOutputStream(OutputStream out) throws IOException
{
super(out);
}

@Override
protected void writeStreamHeader() throws IOException
{
return;
}
}


2.ObjectSave.Java文件

public static void main(String[] args)
{
ObjectOutputStream out = null;
ObjectInputStream in = null;
/*
* List<User> list = new ArrayList<User>(); list.add(new User("admin",
* "admin", "123", 1)); list.add(new User("zhang", "zhang", "123", 0));
*/

List<History> list = new ArrayList<History>();
list.add(new History("baidu.com", new Date()));
list.add(new History("google.hk", new Date()));
String path = "d://abc";
try
{ // 判断文件大小并调用不同的方法
File file = new File(path);
FileOutputStream fos = new FileOutputStream(file, true);
if (file.length() < 1)
{
out = new ObjectOutputStream(fos);
} else
{
out = new MyObjectOutputStream(fos);
}
// out = new ObjectOutputStream(new BufferedOutputStream(new
// FileOutputStream(path,true)));
// out.writeObject(Calendar.getInstance());
// 判断文件大小并调用不同的方法
for (int i = 0; i < list.size(); i++)
{
out.writeObject(list.get(i));
}
} catch (Exception ex)
{
ex.printStackTrace();
} finally
{
try
{
out.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
try
{
in = new ObjectInputStream(new BufferedInputStream(
new FileInputStream(path)));
// Calendar date = (Calendar) in.readObject();
// System.out.format("On %tA, %<tB %<te, %<tY:%n", date);
while (true)
{
History user = (History) in.readObject();
System.out.println(user.getUrl() + user.getDate());
}
} catch (EOFException e)
{

} catch (Exception ex)
{
ex.printStackTrace();
} finally
{
try
{
in.close();
} catch (IOException e)
{
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 异常
相关文章推荐