免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4555 | 回复: 16
打印 上一主题 下一主题

有关ObjectOutputStream,ObjectInputStream的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-27 16:08 |只看该作者 |倒序浏览
我用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一个文
件,用输出流ObjectOutputStream向文件连续写几个对象,关闭输出流,然
后读取,这些对象都可以读出;这时在向该文件增加对象,新写的对象就读不出了,不知什么原因?请教了!(把下面的程序执行两遍就能看出了)
/*
import java.io.*;

public class MyRun
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!";                                       
                try
                {
                        File testFile=new File("E:/TestData/Info.dat";
                        ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(testFile,true));                       
                        out.writeObject(new String("a");
                        out.writeObject(new String("b");                               
                        out.flush();
                        out.close();
                        ObjectInputStream in=new ObjectInputStream(new FileInputStream(testFile));
                        Object temp;
                        try
                        {
                                while((temp=in.readObject())!=null)
                                {                                       
                                    System.out.println("Object :"+temp);
                                }
                        }
                        catch(Exception e)
                        {
                                e.printStackTrace();
                        }                       
                        in.close();
                        System.out.println("file closed!";
                }
                catch(Exception e)
                {                       
                        System.out.println("Exception:="+e);
                        e.printStackTrace();
                }
        }       
}
*/

论坛徽章:
0
2 [报告]
发表于 2004-12-28 13:09 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

调试了一下好像是循环读取对象的时候程序抛出了异常!
关注!!

论坛徽章:
0
3 [报告]
发表于 2004-12-28 13:25 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

那个程序第一次执行没问题,向文件中写入对象(String) "a",(String) "b",
"a" ,"b"都能读出来,再执行一遍,又写入对象"a","b"(增加了两个对象),读文件时,应该读出"a","b","a","b"啊,可它为什么只读出两个对象"a","b",而不是四个啊?

论坛徽章:
0
4 [报告]
发表于 2004-12-28 15:24 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

楼主检查一下你的程序有没有问题再来讨论对象流的问题吧!

论坛徽章:
0
5 [报告]
发表于 2004-12-28 15:30 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

就因为我看不出问题,所以才来请教的啊

论坛徽章:
0
6 [报告]
发表于 2004-12-28 15:55 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

我试了一下你的代码,发现ObjectOutputStream建立后第一次写入一个对象时,会在对象数据前写入一些标志的数据“AC ED 00 05”(用ultraEdit打开),应该是流相关的信息。当你关闭ObjectOutputStream后再重新打开往文件里面写对象时(append方式),就会再一次把“AC ED 00 05”写入文件,而这些信息并不是你写入对象的数据,所以当你用ObjectInputStream来读取对象时,流会将除第一个“AC ED 00 05”以外的数据当作各个对象的数据,造成无法解析,所以读取时有一个java.io.StreamCorruptedException出现。这个可以通过编辑Info.dat来验证,只要将“AC ED 00 05”删除(第一个“AC ED 00 05”保留)就可以正常读出后来加入的对象。
给出一个比较笨的解决方法:
在以后要添加新的对象到Info.dat时,将里面原有的对象读出放入ArrayList中,清空文件,再将对象集一次写入。
望高手指正!

论坛徽章:
0
7 [报告]
发表于 2004-12-29 09:36 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

哪位哥们有更好的办法添加新的对象?

论坛徽章:
0
8 [报告]
发表于 2004-12-29 12:44 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

标志的数据根据版本的不同因该是不一样的

论坛徽章:
0
9 [报告]
发表于 2004-12-29 19:46 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

那个“AC ED 00 05”是ObjectOutputStream.writeSystemHeader()写进去的,你可以继承ObjectOutputStream类,覆盖这个方法。在你自己的writeSystemHeader()里判断是不是第一次写入一个文件,如果是向一个文件大小不为零的文件追加的话,就调用super.reset().。如果是第一次写这个文件,不是追加,就调用super.writeSystemHeader()

论坛徽章:
0
10 [报告]
发表于 2004-12-30 09:33 |只看该作者

有关ObjectOutputStream,ObjectInputStream的问题

是要覆盖ObjectOutputStream.writeStreamHeader()的方法吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP