取消从 InputStream 读取
Posted
技术标签:
【中文标题】取消从 InputStream 读取【英文标题】:cancel a read from an InputStream 【发布时间】:2010-12-20 03:52:08 【问题描述】:目前我正在使用ObjecInputStream
从Socket
读取数据,使用这个简单的代码一切正常:
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object response = input.readObject();
现在我想以某种方式取消读取,而不关闭流,以便以后可以再次读取它。有可能吗?
编辑:我想取消读取只是因为它阻塞了程序流程。我不需要两次阅读相同的信息。我只是想取消它,以便我可以发送另一个请求,然后读取(另一个)响应。
【问题讨论】:
我的印象是,根据迄今为止的回答,有不止一种方法可以解释您的问题。您是否要取消 readObject() [因为它正在阻塞] 并能够稍后再次调用它?或者让其他海报正确地固定它,而您只是在寻找一种将流回滚的方法(尽管您仍然必须找到一种方法来摆脱 readObject())。 感谢 PSpeed,请查看我的更新 :) 【参考方案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。有一个线程专门用于读取和某些扩展处理输入。如果基于事件,则将结果排队到主线程,如果使用共享状态设计,则修改模型。
【讨论】:
以上是关于取消从 InputStream 读取的主要内容,如果未能解决你的问题,请参考以下文章
从 OutputStream 创建 InputStream 的最有效方法
从 OutputStream 创建 InputStream 的最有效方法