ObjectInputStream的工作

时间:2011-06-16 22:00:15

标签: java serialization objectinputstream

我有多个对象存储在一个文件中。这是关于ObjectInputStream的。如果我有以下代码:

FileInputStream fis = new FileInputStream(filename);

ObjectInputStream ois = new ObjectInputStream(fis);

Object obj1 = (Object)ois.readObject();

ois.close();
 ois = new ObjectInputStream(fis);

Object obj2 = (Object)ois.readObject();

我的问题是:从第二个对象流(obj2)调用的readObject是文件中的第一个还是第二个对象

2 个答案:

答案 0 :(得分:3)

它实际上会引发异常。在ObjectInputStream上调用close也将关闭FileInputStream。

答案 1 :(得分:0)

这取决于您存储对象的方式。如果您使用了一个ObjectOutputStream,那么最好还使用一个ObjectInputStream。

如果您使用单独的流进行输出,则还应该为输入使用单独的流。但这并不是真的值得推荐的。


对于你的“持久队列”,我建议这样:

在发送方:

  • 创建一个ByteArrayOutputStream,围绕它包装一个ObjectOutputStream。
  • 将对象写入OOS,然后关闭OOS。
  • 获取byte[],并将其与表示队列流长度的标题一起编写。

在接收方:

  • 从队列流中读取标头长度。
  • 从队列流中读取给定长度的byte[]
  • 从此数组创建一个ByteArrayInputStream,并在其周围包装一个ObjectInputStream。
  • 从OIS读取一个对象,关闭OIS。

存储部分队列时,请务必始终存储整条消息(即标题与对象一起)。

当然,使用现有的解决方案可能更容易,例如JMS(您将在其中创建ObjectMessage,并将其提交到队列中)。