2010-05-28 77 views
0

所以我试图写出一个对象到一个ByteArray,但由于某种原因,它不写任何东西,我看到的事实是返回值为0,读它会导致一个例外。OutputStream与ByteArrayOutputStream不写

BAoutput = new ByteArrayOutputStream(); 
Oout = new ObjectOutputStream(BAoutput); 
Oout.writeObject(receiver); 

其中receiver是我通过参数获得的对象。 的例外始终是相同的:

java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 

任何想法?

大部分代码:(有一对夫妇在它上面的定义,没有什么有趣的真)

try { 
     BAoutput = new ByteArrayOutputStream(); 
     Oout = new ObjectOutputStream(BAoutput); 
     BAinput = new ByteArrayInputStream(BAoutput.toByteArray()); 
     Oin = new ObjectInputStream(BAinput); 

     Oout.writeObject(receiver); 
     retval = method.invoke(receiver, args); 
     for (Method curr: postMethods){ 
      curr.setAccessible(true); 
      if (curr.invoke(receiver).equals(false)){ 
       receiver = Oin.readObject(); 
       throw new PostconditionFailure(); 
      } 
     }   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      Oin.close(); 
      Oout.close(); 
      BAinput.close(); 
      BAoutput.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

您是否刷新/关闭输出流? – Synesso 2010-05-28 06:27:23

+0

抛出的实际异常是什么? – 2010-05-28 06:28:10

+0

请添加例外的第一行(例外类型和消息) – 2010-05-28 06:28:37

回答

0

这对我来说没有多大意义。

所以我想写出一个对象为ByteArray,但由于某些原因,它没有书面方式什么,这是我的事实,返回值是0

什么是返回看0? writeObject方法根本不返回任何值 - 它的void方法!

...而且由于阅读它会导致异常。

这并不一定意味着写入失败。

我想我们需要看>>>所有< < < <与读和写有关的代码,包括类型声明和任何封闭的try/catch块。

编辑

现在我看到完整的代码,很显然,真正的问题是什么:

.... 
    BAoutput = new ByteArrayOutputStream(); 
    Oout = new ObjectOutputStream(BAoutput); 
    BAinput = new ByteArrayInputStream(BAoutput.toByteArray()); 
    Oin = new ObjectInputStream(BAinput); 
    ... 

ByteArrayOutputStream.toByteArray()方法返回一个复制的当前内容的流。由于还没有写入流,所以字节数组自然是空的。

的解决问题的方法是提取字节数组,并构建ByteArrayInputStream后,你已经完成写入Oout并刷新或关闭它。

+0

我想我应该更清楚。我的意思是使用Oin.avaliable(),我知道它没有什么可读的。 无论如何,代码在OP中。 – Yonatan 2010-05-28 07:44:18

1

首先需要检查的事项:

  • 冲洗/关闭的ObjectOutputStream(如Synesso已经在他的评论中指出)
  • 确保receiver是可序列化的(或原始类型)
+0

我关闭了输出和输入流,但可能没有在正确的时间? 也,我不是那么确定何时何地应该冲洗。 接收器是可序列化的。 另外,增加了例外。当我ctrl + Ced它时,该行没有标记。 – Yonatan 2010-05-28 06:53:35

+0

在打开输入流进行读取之前,应该关闭输出流,并且可以在最后一次写入之后立即刷新输出流。 – 2010-05-28 07:11:08

相关问题