CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

从文件中读对象时抛出的异常:java.io.StreamCorruptedException: unexpected block data

楼主yigeyigeyige(怡戈)2005-01-02 21:29:19 在 Java / J2SE / 基础类 提问

如题:  
  这是书上的一个例子:  
  //写对象到文件中。  
  private   void   saveSketch(File   outFile)   {  
          try   {  
              ObjectOutputStream   out   =     new   ObjectOutputStream(  
                                                                  new   BufferedOutputStream(  
                                                                  new   FileOutputStream(outFile)));  
              out.writeObject(m_model);                 //   Write   the   sketch   to   the  
                                                                                                    //   stream  
              out.close();                                                               //   Flush   &   close   it  
          }   catch(IOException   e)   {  
              System.err.println(e);  
          }  
  }  
  读对象到文件中:  
  public   void   insertModel(String   filePath){  
  File   inFile   =   new   File(filePath);  
  try   {  
              ObjectInputStream   in   =   new   ObjectInputStream(  
                                                                                                  new   BufferedInputStream(  
                                                              new   FileInputStream(inFile)));  
              m_model   =   (SketchModel)in.readObject();  
              in.close();            
                    }   catch(Exception   e)   {  
              System.out.println(e);  
          }  
  }  
  就这样两段程序,我用书上的工程编译后,执行正常,可以将对象保存在文件中并读出来。把这段代码拷到我自己的工程中,也可以用。  
  问题在于:书上的工程产生的文件,用我自己的工程无法读出对象:报java.io.StreamCorruptedException:   unexpected   block   data。  
  而用我自己的工程创建的对象,用书上的工程读不出来,报:  
  java.lang.ClassNotFoundException  
  不知是何原因。 问题点数:100、回复次数:19Top

1 楼andy08160819(潇潇暮雨)回复于 2005-01-03 01:37:38 得分 5

java.lang.ClassNotFoundException  
  没有编译?或者编译不成功!  
  java.io.StreamCorruptedException:   unexpected   block   data。  
  你在写入文件的时候流好象用错了,具体你看下书上用的什么流Top

2 楼andy08160819(潇潇暮雨)回复于 2005-01-03 01:38:13 得分 5

不是写入文件,而是读文件  
  不好意思Top

3 楼mrwest(James West)回复于 2005-01-03 07:16:25 得分 5

如果没记错的话,我记得好像你要写的对象的类一定要实现一个Serializable接口Top

4 楼yigeyigeyige(怡戈)回复于 2005-01-03 10:01:42 得分 0

1、java.lang.ClassNotFoundException是运行时开发环境抛出的,编译绝对没有问题。  
  2、“你在写入文件的时候流好象用错了,具体你看下书上用的什么流。”用的流肯定没问题,因为我用各自的程序生成的文件存储和读取各自的对象,都是正常的。  
  3、我要写的对象是SketchModel类,当然实现了Serializable接口。  
  4、大家好象并没有完全明白我的意思:两个程序独立工作都是正常的,对象可以被存储和读回,但两个程序产生的文件无法被对方读取,虽然存储的对象数据结构和读写文件的方法是一模一样的。  
  5、今天对比了一下两个程序生成的文件,发现其唯一的区别是:一个文件头为:..sr..nt2000..picedit..sktechmodel,另一个为::..sr..sktechmodel,后面是一样的。前面的nt2000..picedit是我的工程名称和包名称,后面一个不在包里头。Top

5 楼lizzz(不是程序员)回复于 2005-01-03 10:15:46 得分 10

既然两个类所属的包都不一样,怎么能说这两个类是一样的呢?  
  如果是一样的,那么a.A.java   ==   b.A.java,那不得天下大乱:)Top

6 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-01-03 10:27:45 得分 5

既然是作用完全相同的类,那么为什么还要用两个呢??只用一个类,然后重用它不就行了?Top

7 楼vongood((my c++))回复于 2005-01-03 12:07:15 得分 5

gzTop

8 楼yigeyigeyige(怡戈)回复于 2005-01-03 16:32:09 得分 0

“既然是作用完全相同的类,那么为什么还要用两个呢??只用一个类,然后重用它不就行了?”,首先,抛开为何要这么使用,我想弄清楚,不能互相读写,是否是因为其所属的包不同?如果是这样的话,比如我公司一个应用的数据文件,现在要让另一个公司的应用能够使用,那么,我除了提供所存属对象的数据结构外,还需要提供什么?需要把类所属的包结构也提供吗?或者说,我公司在开发这个类时要有什么注意事项才能方便地为别人(或公司)提供共享。  
  我是一初学者,望大家支持。Top

9 楼yigeyigeyige(怡戈)回复于 2005-01-03 16:35:25 得分 0

补充:  
  m_model   =   (SketchModel)in.readObject();  
  这一句即使不做类型转换,写成:Object   obj   =   in.readObject();仍然抛出同样的异常。Top

10 楼mrwest(James West)回复于 2005-01-03 16:47:30 得分 5

既然文件头部一样,那老兄你试试把他写一样了,首先在每个要进行写入的类当中添一个String   类型的静态成员,比如说  
  private   static   final   String   fileFlag   =   "XXX_FILE";  
  然后在你写对象的前一行,也就是  
  out.writeObject(m_model);  
  的前面加一行,  
  out.writeObject(fileFlag);  
  这样文件头就一样了,  
   
  然后,在读取对象的类中,读取对象的语句前面加上  
  String   s   =   (String)   in.readObject();  
                          if(!s.equals(fileFlag))   {  
                                  throw   new   IOException("...");  
                          }  
  然后再  
  m_model   =   (SketchModel)in.readObject();  
  这样试一下。不知道行不行   :)Top

11 楼yigeyigeyige(怡戈)回复于 2005-01-03 17:11:00 得分 0

to:mrwest:  
  试了,即使是本程序的读写都不行。Top

12 楼mrwest(James West)回复于 2005-01-03 17:18:54 得分 5

msn:   mrwest@133sh.com  
  email:   mrwest@133sh.com  
  愿意与老兄你共同研究这个难题:)Top

13 楼mrwest(James West)回复于 2005-01-03 17:19:39 得分 5

顺便问一下,你这个SketchModel是继承了哪个model?Top

14 楼yigeyigeyige(怡戈)回复于 2005-01-03 19:57:47 得分 0

SketchModel:  
  import   java.util.Observable;  
  import   java.util.LinkedList;  
  import   java.util.Iterator;  
  import   java.io.Serializable;  
   
  class   SketchModel   extends   Observable   implements   Serializable   {  
      public   boolean   remove(Element   element)   {  
          boolean   removed   =   elementList.remove(element);  
          if(removed)   {  
              setChanged();  
              notifyObservers(element.getBounds());  
          }  
   
          return   removed;  
      }  
       
      public   void   add(Element   element)   {  
          elementList.add(element);  
          setChanged();  
          notifyObservers(element.getBounds());  
      }  
   
      public   Iterator   getIterator()   {  
          return   elementList.listIterator();      
      }  
   
      protected   LinkedList   elementList   =   new   LinkedList();  
  }  
  Top

15 楼yigeyigeyige(怡戈)回复于 2005-01-03 20:00:27 得分 0

补充:  
    public   void   add(Element   element)   中的Element较长,就不贴了,它是一个保存基本图形单元的类,如:Line,保存其颜色、长度、位置等信息。Top

16 楼mrwest(James West)回复于 2005-01-03 22:45:30 得分 20

是不是能修改一下,改成写那个elementList对象,而不写整个SketchModel?  
  我上星期刚做了个模拟考试系统,我们老师布置的项目,用的是tableModel,存储数据用的是Vector,我是把Vector的对象往文件里边写,同样是写对象。Top

17 楼yigeyigeyige(怡戈)回复于 2005-01-04 20:02:30 得分 0

嗯,试了一下。文件头倒是一样了,不过又发现,把element写文件时,比如Circel类,在文件里还会有:nt2000..picedit..Element$Circel这样的工程..包..类$内置类这样的标记。虽然没在另一个工程里试,不过估计还是一样。在Circel的writeObject中,只写了:out.writeDouble(circle.width);读时:double   width   =   in.readDouble();  
              circle   =   new   Ellipse2D.Double(0,0,width,width);  
  不知要怎处理了,好在对手头工程没什么影响。  
  贴子再放一、二天吧,看看大家还有什么意见,到时一定结贴。  
  谢谢。Top

18 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-01-04 23:37:50 得分 30

既然你们所要的文件只是为了和别的公司交换数据用,那么为什么不用XML呢?中性的XML天生就是数据交换的好载体。  
   
  举一个简单的例子:  
  --------------------------------  
  XMLEncoder   xmlencd   =    
          new   XMLEncoder(    
                new   BufferedOutputStream(      
                        new   FileOutputStream(   "c:/myinf.xml"   )   )   );  
                           
  xmlencd.writeObject(   myinf   );   //myinf就是你要系列化的对象  
  xmlencd.close();  
  --------------------------------  
   
  如果你要系列化的对象包含的信息都可以转换为字符文本信息,那么用上面的代码就可以直接的系列化对象了,如果包含非字符文本的二进制或多媒体数据,那就需要一套编码解码机制将数据在二进制和字符数据之间转换了。  
   
  你的程序要实现的功能同样是对象的系列化,用xml多简单?而且兼容性和扩展性也要强的多呢。Top

19 楼yigeyigeyige(怡戈)回复于 2005-01-05 20:41:07 得分 0

XML看来是正道,虽然复杂了些。比如前些天想把一棵树写进XML,大致也像楼上的写法,但死活就是出错。最后还是用了递归来写XML。有机会可以研究一下。  
  其实我也并没有和别公司交换数据的需要,只是正好发现了这个问题而已,想看看大家都是怎么处理系列化的。  
  感谢大家对我的帖子的支持,希望今后继续,结贴了。Top

相关问题

  • applet 连接 oracle出错,抛出 Io 异常。。。。
  • 异常抛出
  • 不抛出异常?
  • socket抛出异常
  • CoUninitialize抛出异常
  • io
  • 关于抛出异常
  • JSF抛出java.lang.NullPointerException异常
  • weblogic抛出异常问题
  • JDBC连接Access,抛出SQLException!!!

关键词

  • 文件
  • 数据
  • 字符
  • 交换
  • 对象
  • sketchmodel
  • elementlist
  • streamcorruptedexception
  • 类
  • 抛出

得分解答快速导航

  • 帖主:yigeyigeyige
  • andy08160819
  • andy08160819
  • mrwest
  • lizzz
  • wingtrace
  • vongood
  • mrwest
  • mrwest
  • mrwest
  • mrwest
  • wingtrace

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo