2011-07-29 47 views
1

有可能从InputStream跳过数据如何删除缓冲的OutputStream中的缓冲数据?

in.skip(in.available());

但如果你想要做的OutputStream类似的事情,我发现

socket.getOutputStream()的flush()。

但这并不相同,flush会传输缓冲的数据而不是忽略它。

是否有任何删除缓冲数据的可能性?

感谢

编辑

的情况是客户端 - 服务器应用程序,当一个新的命令发送(从客户端) 它(试行),以确保该复读将对应于发送的最后一个命令。

某些命令由(人为触发)事件发送,其他命令由自动线程发送。 如果一个命令在缓冲区上,并且发送了一个新命令,那么答案将是第一个,导致失步。

当然,一个同步方法加上一个名为“waitingCommand”的标志可能是更安全的方法,但由于通信不可靠,这种方法很慢(取决于超时)。这就是为什么我要求跳过方法。

回答

2

我不知道,如果它是有道理的,但你可以尝试:

class MyBufferedOutputStream extends java.io.BufferedOutputStream { 

    public MyBufferedOutputStream(OutputStream out) { 
     super(out); 
    } 

    /** throw away everything in a buffer without writing it */ 
    public synchronized void skip() { 
     count = 0; 
    } 

} 
+0

我觉得Secundary缓冲似乎是答案,谢谢你的实现示例 –

3

您无法删除您可能发送的数据。您可以将数据写入像ByteArrayOutputStream这样的内存中的OutputStream,并仅复制所需的部分。

2

“跳过”输出数据意味着什么?

一旦数据在缓冲区中,就没有办法恢复或删除它。我建议您检查是否要在之前跳过数据,然后将其写入OutputStream。要么,要么有自己的二级缓冲区,您可以随意修改。

+0

Secundary缓冲似乎是答案 –

0

由于您正在控制写入OutputStream的数据,因此不要编写您不需要的部分。 OutputStream by contract,并不能确保数据实际写入的时间,所以跳过方法没有多大意义。

+0

请参阅编辑,我不能写入数据的总量控制,或者如果我这样做,交际变得较慢 –

0

你可以做的最好的办法是“忽略”输出数据,而不是先写它。

+0

我希望我可以,看到编辑 –

1

这个问题没有任何意义。抛出挂起的请求只会让你的应用协议问题变得更糟。等待被删除请求的响应的人会发生什么?该请求应该实现的功能发生了什么变化?你需要从另一个角度重新考虑这一切。如果您与正在为此客户端执行请求/响应事务的服务器建立单一连接,则该协议已经是顺序的。您将不得不在例如在写入&时,套接字刷新请求并读取响应,但由于无论如何都会对另一端的处理进行序列化,因此您不会失去任何性能。你不需要'waitingCommand'标志,只需要同步。

+0

我同意,无论如何,我会给+1,因为你了解问题,但*通道根本不可靠*,有很多数据丢失和重新连接,所以为了尽量减少影响对于用户,我会添加第二种方法(并非完全去同步但具有优先级),放弃自动化命令以首先解决最近的人类命令,阻止每次传输超时将变得非常缓慢,其次,“waitngCommand”我的意思是同样的“刚刚同步”,旗帜只是为了避免“虚假唤醒”而已lways建议同步检查变量。感谢 –

+0

@HernánEche这是一个什么样的频道?也许你应该使用两个渠道,一个用于自动化的东西,一个用于用户的东西?而我仍然没有得到关于布尔值的东西。您需要一个带有wait()/ notify()而不是synchronized(synchronized()关键字)的布尔值。 – EJP

+0

你好,wait()和notify()并不是真正可以分开的* synchronized *关键字,它们一起工作。该频道是GSM/GPRS网络(丑陋的频道)。关于布尔(不需要是布尔值),请参阅http://vladimir_prus.blogspot.com/2005/07/spurious-wakeups.html http://www.devguli.com/blog/eng/spurious-wakeup/问候! –