Yonatan
Yonatan

Reputation: 93

OutputStream with ByteArrayOutputStream not writing

So i'm trying to write out an object to a ByteArray, but for some reason it's not writting anything, which i see by the fact that the return value is 0, and that by the fact that reading it results in an exception.

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

where receiver is an object i get through a parameter. and the exceptions are always the same:

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)

Any ideas?

most of the code: (there are a couple of definitions above it, nothing interesting really)

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

Upvotes: 0

Views: 4819

Answers (2)

Stephen C
Stephen C

Reputation: 718826

This is not making a lot of sense to me.

So i'm trying to write out an object to a ByteArray, but for some reason it's not writting anything, which i see by the fact that the return value is 0

What is returning 0? The writeObject method does not return any value at all - its a void method!

... and that by the fact that reading it results in an exception.

That doesn't necessarily mean that the write failed.

I think we need to see >>>all<<< of the code that is involved with the reading and the writing, including type declarations and any enclosing try / catch blocks.

EDIT

Now that I see the complete code, it is clear what the real problem is:

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

The ByteArrayOutputStream.toByteArray() method returns a copy of the current contents of the stream. Since nothing has been written to the stream yet, the byte array is naturally empty.

The solution to your problem is to extract the byte array and construct the ByteArrayInputStream after you have finished writing to Oout and have flushed or closed it.

Upvotes: 0

Andreas Dolk
Andreas Dolk

Reputation: 114777

First things to check:

  • flush/close the ObjectOutputStream (as Synesso already stated in his comment)
  • Make sure that receiver is Serializable (or a primitive type)

Upvotes: 1

Related Questions