2011-06-16 31 views
0

我有多个对象存储在一个文件中。这是关于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(); 

我的问题是:从第二个对象流称为的readObject(OBJ2)是文件中的第一或第二个对象

+1

不会'ois.close();'也关闭'fis'?如果是这样,第二次读取可能会失败。 – 2011-06-16 22:05:58

+0

如果我不关闭流,那么该怎么办?不要使用ois.close()。此外,如果我关闭fis.close()将关闭两个ObjectInputStream – Zen 2011-06-16 22:21:41

回答

3

它将INFACT抛出例外。调用关闭ObjectInputStream也会关闭FileInputStream。

+0

如果我不关闭流,即如何。不要使用ois.close()。此外,如果我关闭fis.close()将关闭ObjectInputStream – Zen 2011-06-16 22:10:40

+0

@Tarun它不会工作; ObjectInputStream在内部进行缓冲。您可能需要继续使用相同的ObjectInputStream,否则您需要重新创建一个新的FileInputStream。 – 2011-06-16 22:35:26

+0

@Tarun - 你有没有想要解决的特殊问题?这听起来像你希望能够保留输入流中的读取位置,以防崩溃或其他意外文件流关闭。是这样吗? – Perception 2011-06-20 12:56:33

0

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

如果您对输出使用了单独的流,则还应该为输入使用单独的流。但这并不是真正的建议。


为贵 “的持久性队列”,我建议是这样的:

在发送端:

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

在接收侧:

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

当您存储部分队列时,请务必始终存储整个消息(即头部与对象一起)。

当然,使用已经存在的解决方案可能更容易,比如JMS(您将创建一个ObjectMessage并将其提交给队列)。

+0

基本上,我试图创建一个持久队列。 – Zen 2011-06-18 05:28:13

+0

@Tarun:对于持久队列,您可能想要使用单独的ObjectOutputStreams。我只是编辑了一个可能的解决方案的答案。 – 2011-06-18 18:55:44