【问题标题】:cancel a read from an InputStream取消从 InputStream 读取
【发布时间】:2010-12-20 03:52:08
【问题描述】:

目前我正在使用ObjecInputStreamSocket 读取数据,使用这个简单的代码一切正常:

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object response = input.readObject();

现在我想以某种方式取消读取,而不关闭流,以便以后可以再次读取它。有可能吗?

编辑:我想取消读取只是因为它阻塞了程序流程。我不需要两次阅读相同的信息。我只是想取消它,以便我可以发送另一个请求,然后读取(另一个)响应。

【问题讨论】:

  • 我的印象是,根据迄今为止的回答,有不止一种方法可以解释您的问题。您是否要取消 readObject() [因为它正在阻塞] 并能够稍后再次调用它?或者让其他海报正确地固定它,而您只是在寻找一种将流回滚的方法(尽管您仍然必须找到一种方法来摆脱 readObject())。
  • 感谢 PSpeed,请查看我的更新 :)

标签: java inputstream outputstream


【解决方案1】:

查看ObjectInputStream.markSupported() 返回的内容。如果返回true,您可以在开头调用ObjectInputStream.mark(),然后调用ObjectInputStream.reset()InputStream倒回您标记的位置,以便以后重复使用。

【讨论】:

  • 那么,如果返回false怎么办?顺便说一句,我不想​​两次读取相同的数据,我只想取消读取,以便我可以发送另一个请求然后读取另一个响应。
  • @phunehehe:如果它返回false,则此InputStream 不支持标记/重置,并且此策略对您不起作用。无论如何,如果您没有两次重新读取相同的数据(原始问题中未提及),那么该策略无论如何都不会适用。为什么不简单地实例化一个新的ObjectInputStream?现在对象实例化很便宜。
  • 但是当我再次调用input = new ObjectInputStream(socket.getInputStream()); 时程序阻塞了我认为这一定是旧流的问题(实际上我认为它们是来自同一个套接字的同一个流)。我必须创建另一个套接字吗?
  • @phunehehe:是的。打开一个新的套接字。
【解决方案2】:

您可以使用PushBackInputStream 来完成此操作。读取一些字节后,您可以取消读取这些字节。

【讨论】:

    【解决方案3】:

    如果您有某种“主”线程,那么您应该从它执行 I/O。有一个线程专门用于读取和某些扩展处理输入。如果基于事件,则将结果排队到主线程,如果使用共享状态设计,则修改模型。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 2011-11-16
      • 2018-06-26
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2010-11-18
      • 2015-05-23
      相关资源
      最近更新 更多