取消从 InputStream 读取

Posted

技术标签:

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

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

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 读取的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式取消从 InputStream 中读取?

从 OutputStream 创建 InputStream 的最有效方法

从 OutputStream 创建 InputStream 的最有效方法

14. 流文件和IO

HttpServletRequest InputStream 已损坏?

使用 Java 读取文件或流的最强大的方法(以防止 DoS 攻击)