OutputStream с ByteArrayOutputStream не пишет

Итак, я пытаюсь записать объект в 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();
        }
    }

person Yonatan    schedule 28.05.2010    source источник
comment
Вы сбрасываете/закрываете выходной поток?   -  person Synesso    schedule 28.05.2010
comment
Какое фактическое исключение выбрасывается?   -  person Michael Mrozek    schedule 28.05.2010
comment
Пожалуйста, добавьте первую строку (строки) исключения (тип исключения и сообщение)   -  person Andreas Dolk    schedule 28.05.2010


Ответы (2)


Это не имеет большого смысла для меня.

Итак, я пытаюсь записать объект в 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 и сбросили или закрыли его.

person Stephen C    schedule 28.05.2010
comment
Я думаю, я должен был быть более ясным. Я имел в виду, используя Oin.avaliable(), я знал, что ему нечего читать. В любом случае, код находится в OP. - person Yonatan; 28.05.2010

Первое, что нужно проверить:

  • очистить/закрыть ObjectOutputStream (как уже заявил Синессо в своем комментарии)
  • Убедитесь, что receiver является сериализуемым (или примитивным типом)
person Andreas Dolk    schedule 28.05.2010
comment
Я закрываю поток вывода и ввода, но, возможно, не в нужное время? Кроме того, я не уверен, где и когда я должен смывать. получатель является Сериализуемым. Кроме того, добавлено исключение. линия не была отмечена, когда я нажал ее ctrl+Ced. - person Yonatan; 28.05.2010
comment
Выходной поток должен быть закрыт до того, как вы откроете входной поток для чтения, и вы можете очистить выходной поток сразу после последней записи. - person Andreas Dolk; 28.05.2010