对象流注意点
2015-09-21 20:40
155 查看
作业的大致要求是,定义两个方法,一个方法用ObjectOutputStream流写入几个对象(每次只写一个对象),另外一个方法读取几个对象,返回一个。
碰到的问题01:
Exceptioninthread"main"java.io.StreamCorruptedException:invalidtypecode:AC
这个真的是难到我了,解决了很久,都没有解决,然后就上网看了下,
Theunderlyingproblemisthatyouareusinganew
youhavealreadyusedaprior
constructors,soifyoucreateanother
theexisting
来源:<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),导致抛出异常。
解决的办法,一开始还没有想出来,还是有时候思路太局限了。老师一说,直接捕捉这个异常,然后异常中处理的内容就是返回就行了,当时就觉得思想被局限了,这个方法还是知道的。但是就是没有想到,心里有点凉。
以下是完整的代码:
碰到的问题01:
Exceptioninthread"main"java.io.StreamCorruptedException:invalidtypecode:AC
这个真的是难到我了,解决了很久,都没有解决,然后就上网看了下,
Theunderlyingproblemisthatyouareusinganew
ObjectOutputStreamtowritetoanexisting
ObjectInputStreamthat
youhavealreadyusedaprior
ObjectOutputStreamtowriteto.Thesestreamshaveheaderswhicharewrittenandreadbytherespective
constructors,soifyoucreateanother
ObjectOutputStreamyouwillwriteanewheader,whichstartswith-guesswhat?-
0xAC,and
theexisting
ObjectInputStreamisn'texpectinganotherheaderatthispointsoitbarfs.
来源:<
大致的意思是,每次用一个新的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+"]";
}
}
相关文章推荐
- iOS开发脚踏实地学习day12-通讯录和plist存储
- 坦克发射炮弹打死自己的问题
- 快手之家(aardio.net) - 构思
- scanner 死循环问题
- 嵌入式硬件及接口开发实践
- iOS: 转载CoreData数据库框架
- [Android] 混音线程MixerThread
- Java中删除文件、删除目录及目录下所有文件
- 关于linux下GCC生成共享库(动态链接库)的探究
- 浅谈iOS中MVVM的架构与团队协作
- -Java语法基础(概述)
- java File类
- 工业设计如何从零开始学手绘
- 【经验帖】Ubuntu12.04安装cuda6.0以及配置Nsight开发环境教程
- Hibernate related
- CYC-集合视图 UICollectionView的简单使用
- 黑马程序员_java 操作文件的扩展,制作excel表格
- js判断是否定义
- 《程序员面试金典》--分割链表
- java中创建对象的方法