0

我有多个对象存储在一个文件中。这是关于 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 会是文件中的第一个还是第二个对象

4

2 回答 2

3

它实际上会抛出异常。在 ObjectInputStream 上调用 close 也会关闭 FileInputStream。

于 2011-06-16T22:05:50.223 回答
0

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

如果您使用单独的流作为输出,您也应该使用单独的流作为输入。但这并不是真正推荐的。


对于您的“持久队列”,我会推荐这样的东西:

在发送方:

  • 创建一个 ByteArrayOutputStream,在它周围包裹一个 ObjectOutputStream。
  • 将对象写入OOS,并关闭OOS。
  • 获取byte[], 并将其与指示队列流长度的标头一起写入。

在接收方:

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

当您存储部分队列时,请确保始终存储整个消息(即标题与对象一起)。

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

于 2011-06-16T23:39:33.587 回答