1

我将一些对象放入流中,然后从中取出字节数组,然后读回所有内容。前两条数据完好无损,然后我得到零,然后是 EOF 异常。为什么?

try {
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
     objectOutputStream.writeObject("abcdef");
     objectOutputStream.writeInt(1);
     objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8});
     objectOutputStream.writeInt(2);
     objectOutputStream.writeObject(new byte[]{11,12,13,14,15,16,17,18});
     objectOutputStream.close();


     byte[] original = byteArrayOutputStream.toByteArray();
     System.out.println(Arrays.toString(original));

     byte[] b=new byte[8];
     ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(original));
     String s= (String) objectInputStream.readObject(); // works fine
     objectInputStream.readInt(); // works fine

     objectInputStream.read(b); // why it reads zeroes instead of [1,2,3,4,5,6,7,8]?
     System.out.println(Arrays.toString(b));
     int length = objectInputStream.readInt(); // EOF unexpectedly reached, why?
     objectInputStream.read(b);
}
catch (IOException e) {
     e.printStackTrace();
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}

例外:

java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2775)
at java.io.ObjectInputStream.readInt(ObjectInputStream.java:949)
4

3 回答 3

5

我怀疑第一个问题是你需要close()你的objectOutputStream. 有关示例,请参阅ObjectOutputStream 文档

于 2012-09-06T14:57:40.730 回答
3

除了关闭缓冲流...

您希望每个 writeInt() 都具有 readInt()(正如您所做的那样)您还需要每个 writeObject() 具有 readObject()。

如果你的阅读方式与你写的不同,你就不能指望它有任何意义。

你在做

objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8});

所以你需要做

byte[] bytes = (byte[]) objectInputStream.readObject();
于 2012-09-06T14:58:20.233 回答
0

看看如何ObjectOutputStream处理数组writeObject(具体来说,看看 ObjectOutputStream.writeArray(). 它写入一个数组标记字节(以了解存储的对象类型),然后是数组长度,然后是数组元素本身。

长话短说,你应该用readObject, 而不是 plain读回它read(除非你想自己实际解析那个字节流,而不是期望你的字节像在原始字节数组中那样被检索)。

InputStream.read(byte[])只需获取原始字节流并将它们写入缓冲区。

此外,后续调用(除了read()s 之外)预计会失败,因为指针没有放在反序列化器可以理解的数据结构的开头。

于 2012-09-06T15:04:48.573 回答