2009-11-25 128 views
2

目前我使用的ObjecInputStreamSocket阅读,和一切工作正常使用这个简单的代码:取消读取从InputStream

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

现在我想以某种方式取消读取,无需关闭流,以便我以后可以再读一遍。可能吗?

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

+1

我得到的印象有解释基础上的反应来看你的问题的方法不止一种。 你想取消readObject()[因为它是阻塞的]并且能够在以后再次调用它吗?或者让其他海报正确地固定它,你只是想找一种方法将流回滚(尽管你仍然需要找到一种方法来打破readObject())。 – PSpeed 2009-11-25 04:49:04

+0

感谢PSpeed,请看我的更新:) – phunehehe 2009-11-25 04:56:21

回答

2

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

2

看到什么ObjectInputStream.markSupported()回报。如果返回true,你可以在开始打电话ObjectInputStream.mark(),然后调用ObjectInputStream.reset()倒带InputStream还给你标记,以便以后可以重新使用它的地方。

+0

那么,如果返回false,该怎么办? 顺便说一句我不想两次读取相同的数据,我只想取消读取,以便我可以发送另一个请求,然后读取另一个响应。 – phunehehe 2009-11-25 04:51:52

+0

@phunehehe:如果它返回false,那么这个'InputStream'不支持标记/重置,这个策略对你不起作用。无论如何,如果你没有重读相同的数据两次(在原始问题中没有提到),那么该策略将不适用。你为什么不简单实例化一个新的ObjectInputStream?对象实例化最近很便宜。 – Asaph 2009-11-25 04:54:12

+0

但程序块时,我拨打另一个电话为'输入=新的ObjectInputStream(socket.getInputStream());'我想它一定是与旧流(其实我觉得他们是来自同一个插座相同的流)中的问题。我必须创建另一个套接字吗? – phunehehe 2009-11-25 05:05:19

1

可以使用PushBackInputStream做到这一点。读取一些字节后,您可以读取字节。

+0

谢谢,请参阅我的编辑 – phunehehe 2009-11-25 05:07:12