您的位置:首页 > 其它

对象流注意点

2015-09-21 20:40 155 查看
作业的大致要求是,定义两个方法,一个方法用ObjectOutputStream流写入几个对象(每次只写一个对象),另外一个方法读取几个对象,返回一个。

碰到的问题01:
Exceptioninthread"main"java.io.StreamCorruptedException:invalidtypecode:AC
这个真的是难到我了,解决了很久,都没有解决,然后就上网看了下,

Theunderlyingproblemisthatyouareusinganew
ObjectOutputStream
towritetoanexisting
ObjectInputStream
that
youhavealreadyusedaprior
ObjectOutputStream
towriteto.Thesestreamshaveheaderswhicharewrittenandreadbytherespective
constructors,soifyoucreateanother
ObjectOutputStream
youwillwriteanewheader,whichstartswith-guesswhat?-
0xAC,
and
theexisting
ObjectInputStream
isn'texpectinganotherheaderatthispointsoitbarfs.
来源:<http://stackoverflow.com/questions/2393179/streamcorruptedexception-invalid-type-code-ac>
大致的意思是,每次用一个新的ObjectOutputStream写入文件中去,会写入一个新的header,所以在读的时候回出错,老师还带了我们看了下源码有一个方法writeStreamHeader(),每一个新建的都会写头,所以会出错。

解决办法:
01.这个ObjectOutputStream定义成一个全局的变量,然后在main方法中初始化,然后就只有一次

02.新建一个类继承ObjectOutputStream,然后覆写这个方法,让这个方法的方法体为空,在新建这个流的时候。判断文件的长度,如果是0,则新建的是标准的ObjecctOutputStream,如果不是0,则新建的是自己定义的类,调用方法。

碰到的问题02:
Exceptioninthread"main"java.io.EOFException
的长这个问题的原因就是读取的时候,由于之前学的流的经验。所以,然后又需要循环的读入对象,变态的认为结束的条件就是((obj=bis.readObject())
!=null),导致抛出异常。
解决的办法,一开始还没有想出来,还是有时候思路太局限了。老师一说,直接捕捉这个异常,然后异常中处理的内容就是返回就行了,当时就觉得思想被局限了,这个方法还是知道的。但是就是没有想到,心里有点凉。

以下是完整的代码:

packagecom.qianfeng.ch08;
importjava.io.EOFException;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.Serializable;
importjava.util.ArrayList;
importjava.util.List;
publicclassTestObjectStream{
	publicstaticvoidmain(String[]args)throwsException{
		//text.txt---text.txt.txt;FileNotFoundException
		Filefile=newFile("file/Person.txt");
		List<Person>list=newArrayList<Person>();
		list.add(newPerson(1,"张三1"));
		list.add(newPerson(2,"张三2"));
		list.add(newPerson(3,"张三3"));
		list.add(newPerson(4,"张三4"));
		//保存
		for(inti=0;i<list.size();i++){
		savePersonToFile(list.get(i),file);
}
		//savePersonToFile(p1,file);
		List<Person>list_read=readPersonFormFile(file);
		for(Personperson:list_read){
System.out.println(person);
}
}
	publicstaticvoidsavePersonToFile(Personp,Filefile){
		ObjectOutputStreamstream=null;
		try{
			if(file.length()<=0){
				stream=newObjectOutputStream(newFileOutputStream(file,true));
}else{
				stream=newMyObjectOutputStream(newFileOutputStream(file,true));
}
stream.writeObject(p);
stream.close();
}catch(Exceptione){
e.printStackTrace();
}
}
	publicstaticList<Person>readPersonFormFile(Filefile){
		List<Person>list=newArrayList<>();
		ObjectInputStreamois;
		try{
			ois=newObjectInputStream(newFileInputStream(file));
			Personp=(Person)ois.readObject();
while(p!=null){
list.add(p);
				p=(Person)ois.readObject();
}
ois.close();
}catch(EOFExceptione){
			returnlist;
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
		returnlist;
}
}
classMyObjectOutputStreamextendsObjectOutputStream{
	protectedMyObjectOutputStream(FileOutputStreamfos)throwsIOException,SecurityException{
super(fos);
}
@Override
	protectedvoidwriteStreamHeader()throwsIOException{
System.out.println("写了头");
		//super.writeStreamHeader();
}
}
classPersonimplementsSerializable{
/**
	*
	*/
	privatestaticfinallongserialVersionUID=1L;
	privateintid;
	privateStringname;
	publicPerson(intid,Stringname){
super();
		this.id=id;
		this.name=name;
}
	publicintgetId(){
		returnid;
}
	publicvoidsetId(intid){
		this.id=id;
}
	publicStringgetName(){
		returnname;
}
	publicvoidsetName(Stringname){
		this.name=name;
}
@Override
	publicStringtoString(){
		return"Person[id="+id+",name="+name+"]";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: