没有写入ByteArrayOutputStream的OutputStream

时间:2010-05-28 06:25:54

标签: java serialization bytearray

所以我试图写一个ByteArray的对象,但由于某种原因,它没有写任何东西,我看到返回值为0的事实,并且由于读取它导致了异常。

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();
        }
    }

2 个答案:

答案 0 :(得分:1)

要检查的第一件事:

  • 刷新/关闭ObjectOutputStream(正如Synesso在评论中已经说过的那样)
  • 确保receiver是Serializable(或原始类型)

答案 1 :(得分: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 并刷新或关闭它。