我将一些对象放入流中,然后从中获取字节数组,然后读取所有内容。前两个数据到达状态良好,然后我得到零,然后是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)
答案 0 :(得分:5)
我怀疑第一个问题是你需要close()
objectOutputStream
。有关示例,请参阅ObjectOutputStream documentation。
答案 1 :(得分:3)
关闭缓冲流......
你想为每个writeInt()提供readInt()(就像你一样)你还需要为每个writeObject()提供readObject()。
如果你的阅读方式不同,你就不能指望它有任何意义。
你在做什么
objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8});
所以你需要做
byte[] bytes = (byte[]) objectInputStream.readObject();
答案 2 :(得分:0)
看看ObjectOutputStream
如何处理writeObject
中的数组(具体来说,请查看ObjectOutputStream.writeArray()
。它会写一个数组标记字节(知道存储的是哪种对象),然后数组长度,然后是数组元素本身。
长话短说,你应该用readObject
读取它,而不是用普通的read
读取它(除非你想自己实际解析那个字节流,不要期望你的字节被检索到原始字节数组)。
InputStream.read(byte[])
只需获取原始字节流并将其写入缓冲区。
此外,后续调用(仅仅read()
s除外)预计会失败,因为指针未放置在解串器可以理解的数据结构的开头。