取消从InputStream中的读取

3

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

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

现在我想要在不关闭流的情况下取消读取,以便稍后可以再次从中读取。这是否可能?
编辑:我想取消读取只是因为它阻塞了程序流程。我不需要重复读取相同的信息。我只想取消它,以便我可以发送另一个请求,然后读取(另一个)响应。

1
我有这样的印象,根据迄今为止的回复,有不止一种解释你的问题的方式。你是想取消readObject()(因为它是阻塞的),并能够稍后再次调用它吗?还是其他帖子的作者已经正确地描述了你的需求,你只是在寻找一种将流回滚的方法(尽管你仍然必须找到一种打破readObject()的方法)? - PSpeed
3个回答

2

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


那么,如果返回false该怎么办呢? 顺便说一下,我不想读取相同的数据两次,我只想取消读取,以便可以发送另一个请求,然后读取另一个响应。 - phunehehe
@phunehehe:如果返回值为“false”,则该InputStream不支持标记/重置,因此该策略对您无效。无论如何,如果您不会两次重新读取相同的数据(原始问题中未提到),则该策略也不适用。为什么不直接实例化一个新的ObjectInputStream呢?对象实例化现在很便宜。 - Asaph
但是当我再次调用 input = new ObjectInputStream(socket.getInputStream()); 时,程序会阻塞。我认为这可能是旧流的问题(实际上我认为它们是来自同一套接字的相同流)。我需要创建另一个套接字吗? - phunehehe
@phunehehe:没错。打开一个新的套接字。 - Asaph

2
您可以使用PushBackInputStream来完成此操作。在读取一些字节后,您可以将这些字节推回去(unread)。

2

如果您有某种“主”线程,则应该在其外执行I / O。有一个专门的线程来读取并部分处理输入。如果基于事件,请将结果排队到主线程上,如果使用共享状态设计,请修改模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接