2010-07-05 40 views
11

我想从文件读取一些对象。该代码在第一次迭代中工作正常,在第二次迭代中,它给出了StreamCorruptedException。这里是我的代码,java.io.StreamCorruptedException:无效的类型代码:AC

private ArrayList<Cheque> cheques = null; 
ObjectInputStream ois = null; 
     try { 
      cheques = new ArrayList<Cheque>(4); 
      ois = new ObjectInputStream(new FileInputStream("src\\easycheque\\data\\Templates.dat")); 
      Object o = null; 
      try { 
       o = ois.readObject(); 
       int i=1; 
       while (o != null) { 
        cheques.add((Cheque) o); 
        System.out.println(i++); // prints the number of the iteration 
        o = ois.readObject(); // exception occurs here 
       } 
      } catch (ClassNotFoundException ex) {// for ois readObject() 
       Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex); 

      } catch (EOFException ex) {// for ois readObject() 
       // end of the file reached stop reading 
       System.out.println("ois closed"); 
       ois.close(); 

      } 
     } catch (IOException ex) { 
      Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex); 
     } 

下面是例外的一部分。在打印之前,打印出'1'(因为是sout)

SEVERE: null 
java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 

我不明白为什么会发生这种情况。在少数论坛帖子中,我发现在编写文件的过程中追加到文件时会发生这种情况。这是真正的原因吗? (我在写作阶段追加到文件中)。 如果有,是否有正确的方法来读取附加文件?

这里是代码我使用写入文件

ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream("src\\easycheque\\data\\templates.dat", true)); 

objectOut.writeObject(cheque); 
objectOut.flush(); 
objectOut.close(); 

写作不是一个反复的过程。

谢谢:)

+0

你可以添加写入文件以及示例代码片段? – 2010-07-05 21:28:57

+0

可以改变对象的大小吗?我正在写的每个对象都有一个图像对象(Icon) – Niroshan 2010-07-05 21:51:39

+0

直到readObject()返回null时才循环是不正确的。它不会在流结束时执行该操作,并且可以在您编写空值的任何其他时间执行此操作。您需要循环,直到抛出“EOFException”。 – EJP 2016-02-21 21:13:37

回答

13

(我在写作阶段附加到文件)

而这就是问题所在。您不能附加到ObjectOutputStream。这将最初破坏流,你会得到StreamCorruptedException。

但我已经上留下了一个解决这个问题的SO:一AppendableObjectOutputStream

编辑

从作家我看到你写一个检查对象,并刷新并关闭流。从读者中,我清楚地看到,您正在尝试阅读多个检查对象。你可以阅读第一个,但不是其他的。所以对我来说,非常清楚,您重新打开了Stream并追加了越来越多的检查对象。这是不允许的。

您必须编写全部检查'一个会话'中的对象。或者使用AppendableObjectOutputStream而不是标准的ObjectOutputStream。

+0

是的,这正是我在这里做的。谢谢。 有没有其他的方式来写我的文件,并使用标准的阅读机制? – Niroshan 2010-07-05 22:11:49

+0

您可以编写所有检查来分隔文件 - 但是您必须在一个会话中编写一个文件。(或者使用我的班级 - 那么你不需要改变你的代码) – 2010-07-05 22:19:54

+0

再次感谢,似乎使用你的班级是更好的解决方案 – Niroshan 2010-07-05 22:30:14

3

创建一个新的ObjectInputStream,无需关闭底层的FileInputStream解决了这个问题:

FileInputStream fin = new FileInputStream(file); 
    while (...) { 
     ObjectInputStream oin = new ObjectInputStream(fin); 
     Object o = oin.readObject(); 
     ... 
    } 
    fin.close(); 
+0

这个答案解决了使用多个ObjectOutputStream实例编写单独的检查的根本问题,所以如果文件来自第三方,这是要走的路 – Atreys 2016-03-04 17:57:23

+0

现在你所需要的就是神奇地知道何时打开一个新的ObjectInputStream。解决方案实际上并不是首先引起问题。 – EJP 2017-08-24 09:14:11

相关问题